rilliencot (@rilliencot)

Forum Replies Created

Viewing 4 replies - 1 through 4 (of 4 total)
  • @rilliencot

    Participant

    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.

    @rilliencot

    Participant

    Although 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).

    @rilliencot

    Participant

    Figured 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).

    @rilliencot

    Participant

    I’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?

Viewing 4 replies - 1 through 4 (of 4 total)