rilliencot (@rilliencot)

Forum Replies Created

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

  • rilliencot
    Participant

    @rilliencot

    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

    @rilliencot

    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

    @rilliencot

    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

    @rilliencot

    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)