Forum Replies Created
-
In reply to: Topics Created via API Aren’t Showing
Yep! Switching to the bbp_insert_topic function solved the issues I was having with various things not working correctly.
Thanks again for pointing out where all of that stuff was. I could tell my version was bad but it was the best I had been able to cobble together with my limited understanding. I was in one of those “too ignorant to even know what to look for” phases. I had a (genuinely) fun 4 hours this morning putting together how all of these plugins actually work. It would’ve been longer and frustrating trying to understand why my version wasn’t fully working without the guidance.
In reply to: Topics Created via API Aren’t ShowingAlthough I solved the last issue, a similar one immediately came up after that (The topic count at the top of a forum didn’t count new topics). I had a feeling that as long as I proceeded with this hacked version of the actual bbPress functions that I now thankfully know are responsible for topic creation (thank you Robin, again!), these little discrepencies were going to keep popping up.
So I’ve updated the ‘create_bill’ function to now call
bbp_insert_topic()
(line 24 of \bbpress\includes\topics\functions.php). If I understand things correctly (I’m new to web development and learning as I go), this starts the natural chain of events that should happen anytime a new topic is created (at least it looks to be working). I still need the new endpoint because I’d like to add some custom fields to these topics as well, so now the above php script is the much simpler:<?php /** * Plugin Name: bbPress Bill API * Description: Exposing the bbPress post types to WP API and creating a namespace for bills. * Author: Rillien Cot * Version: 1.6.0 */ /** * Add REST API support to an already registered post type. */ add_action('init', 'register_bbp_post_types', 25); function register_bbp_post_types() { global $wp_post_types; $post_type_name = bbp_get_reply_post_type(); if (isset($wp_post_types[$post_type_name])) { $wp_post_types[$post_type_name]->show_in_rest = true; $wp_post_types[$post_type_name]->rest_base = $post_type_name; $wp_post_types[$post_type_name]->rest_controller_class = 'WP_REST_Posts_Controller'; } $post_type_name = bbp_get_topic_post_type(); if (isset($wp_post_types[$post_type_name])) { $wp_post_types[$post_type_name]->show_in_rest = true; $wp_post_types[$post_type_name]->rest_base = $post_type_name; $wp_post_types[$post_type_name]->rest_controller_class = 'WP_REST_Posts_Controller'; } $post_type_name = bbp_get_forum_post_type(); if (isset($wp_post_types[$post_type_name])) { $wp_post_types[$post_type_name]->show_in_rest = true; $wp_post_types[$post_type_name]->rest_base = $post_type_name; $wp_post_types[$post_type_name]->rest_controller_class = 'WP_REST_Posts_Controller'; } // Add custom REST API endpoint for creating bbPress topic add_action('rest_api_init', 'create_bill_endpoint'); } function create_bill_endpoint() { register_rest_route('pnyx/v2', '/bill/', array( 'methods' => 'POST', 'callback' => 'create_bill', )); } function create_bill($data) { // Extract Data $new_topic_data = $data['new_post_data']; $new_topic_meta = $data['new_post_meta']; // Create new bbPress topic using passed data and meta content $topic_id = bbp_insert_topic($new_topic_data, $new_topic_meta); // Add ACF custom fields to created topic update_field('bill_id', $data['bill_id'], $topic_id); } ?>
and the python that calls it is:
import requests import json # Set your WordPress API authentication details username = "************" password = "***********************" auth = requests.auth.HTTPBasicAuth(username, password) # Create a new post data with post_parent new_post_payload = { "new_post_data": { "post_parent": 40, // use a valid forum_id from your site "post_title": "API Created Post Title", "post_content": "Lorem ipsum content for the new topic", }, "new_post_meta": { "forum_id": 40, //use same forum_id here that you used for "post parent" in 'new_post_data' }, "bill_id": "hrs1111", } # Make the POST request to create a new post wordpress_api_url = "http://pnyx.local/wp-json/pnyx/v2/bill/" response = requests.post( wordpress_api_url, auth=auth, headers={ 'Content-Type': 'application/json', }, data=json.dumps(new_post_payload), )
You’ll notice that the ‘data’ portion of the request has changed from a simple dictionary to nested dictionaries so the bbp_insert_topic function has the correct arguments (it takes two arrays).
In reply to: Topics Created via API Aren’t ShowingFigured it out.
It was an issue with the post meta content. For topics to appear in forums, they apparently need to have a ‘_bbp_last_active_time’. I was able to add this by adding the line
add_post_meta($topic_id, '_bbp_last_active_time', date('Y-m-d H:i:s'));
right below the$topic_id = wp_insert_post($topic_args);
line in the php file (with the date function getting the current datetime and returning it in the proper format).In reply to: Topics Created via API Aren’t ShowingI’m also discovering that the when I create a new topic via the standard route, the following post meta fields are generated in the wp_postMeta table for the topic:
edit_lock edit_last bbp_forum_id bbp_author_ip bbp_last_reply_id bbp_last_active_id bbp_last_active_time bbp_reply_count bbp_reply_count_hidden bbp_voice_count
However, these do not get generated when I create a topic through my API. I have a feeling this is the issue. I’m not really sure what I’m supposed to do about this though. I notice the bbp_forum_id field is included in there. Should I be using this to set that field instead of shoehorning through ‘post_parent’ in an additional plugin?