Is there an API for bbPress
-
Please is there a JSON API for bbPress? If yes how do I access/enable it?
-
Iβm also looking for the REST API for bbPress but unable to find info on it either.
I know nothing of rest, but there’s one for wordpress http://v2.wp-api.org/ does that help?
I know nothing of rest, but thereβs one for wordpress http://v2.wp-api.org/ does that help?
No it doesn’t support bbpress
The below is offered as potential help, and in an effort to help, so if it is rubbish, then please come back, and I will try to help further.
bbpress uses the standard wordpress posts, but with post types of ‘forum’, ‘topic’ and ‘reply’ instead of ‘post’ and ‘page’, and bbpress code itself basically uses wp_query to access the database.
The glossary for wordpress api says
GET /wp-json/wp/v2/posts to get a collection of Posts. This is roughly equivalent to using WP_Query.
so I’d imagine that you would just use the same sort of call, and use wp_query parameters to return what you wanted.
So if for wordpress you had a command that gave you say the latest 5 posts, then this same command would work but just changing whatever that code has for post_type=’post’ to post_type=’topic’
If you wanted topics from a particular forum, you would add the equivalent of post_parent = ID where ID was the forum ID
In essence if you can tell me what you want, I can give you the wp_query, and you could hopefully translate this into json.
Does any of that make sense? π
Sure it does make sense. With WP V2 API, if you want to list the ten latest posts, you use this url http://MY_SITE.COM/wp-json/wp/v2/posts. Please how do you do this to return that of forum topics?
bit more digging
it would appear that wordpress 4.7 takes out the filter capability
https://github.com/WP-API/WP-API/issues/2964
there is plugin that puts it back
https://github.com/WP-API/rest-filter
Otherwise I think they now want you to filter at the client end.
so http://MY_SITE.COM/wp-json/wp/v2/posts gives you all the posts, and then you pick those that are the right post type.
If you try the plugin above, then I think
http://MY_SITE.COM/wp-json/wp/v2/posts?filter[type]=topic
does it
Please do report progress back !!
Thanks. I tried
http://MY_SITE.COM/wp-json/wp/v2/posts?filter[type]=topic
andhttp://MY_SITE.COM/wp-json/wp/v2/posts?filter[type]=forum
but the filter appeared not to work as blog posts was returned. Please not that I have already installed the plugin.ok, I’ve found a link to some code that doesn’t entirely make sense yet, but gives me some clues, but I’ll do some more digging over the next few days.
Okay. I am waiting. Thanks for the help do far.
To enable default REST API support for topics you could use a snippet like this one:
add_action( 'bbp_register_post_types', function() { register_post_type( bbp_get_topic_post_type(), [ 'show_in_rest' => true ] ); }, 11 );
This waits until bbPress has registered its post types, then modifies the properties of the topic post type so that it is exposed via the REST API. You could of course extend it to cover forum and reply posts, too. With that in place, you should find URLs like the following work as expected:
http://bbpress.site/wp-json/wp/v2/topic
…A PHP 5.2-friendly version that also covers the reply and forum post types:
function bbpress_enable_rest_api_support() { $enable_rest = array( 'show_in_rest' => true ); register_post_type( bbp_get_reply_post_type(), $enable_rest ); register_post_type( bbp_get_topic_post_type(), $enable_rest ); register_post_type( bbp_get_forum_post_type(), $enable_rest ); } add_action( 'bbp_register_post_types', 'bbpress_enable_rest_api_support', 11 );
@barryhughes-1 – huge thanks – the answer is always simple once you know !
I’ve just tried
http://mysite.com/wp-json/wp/v2/topic
lists all topics
http://mysite.com/wp-json/wp/v2/forum/16316
lists forum 16316
http://mysite.com/wp-json/wp/v2/topic/?sortBy=date
lists all topics newest first
Just added it as a small plugin available on my site
I found that the above code took away the Forums, Topics and Replies from the dashboard in bbpress.
I found some other code and modified it as follows
/** * Add REST API support to an already registered post type. */ add_action( 'init', 'rew_custom_post_type_rest_support', 25 ); function rew_custom_post_type_rest_support() { 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'; } }
@barryhughes-1 – thoughts – can this be done better?Hi Robin and Barry, thanks for the help so far, it is working now. Though I have noticed that the API is not as robust as I expected it to be. For example the
/reply
endpoint doesn’t show the details of of the person who posted the reply (author
) and moreover, say I wanted to view all the replies for a particular topic; can this be done?As far as I can see that is down to the rest api, not bbpress – it does the same with posts ie not show author.
I suspect barry is way ahead of me in knowledge but these two links seem to show that you write api callbacks into your website and then add them to the api
Apologies all and good catch, Robin!
I don’t think there’s anything wrong with your version of the code, but for the sake of alternatives here’s a fix for what I posted originally:
function bbpress_enable_rest_api() { $types = array( bbp_get_reply_post_type(), bbp_get_forum_post_type(), bbp_get_topic_post_type(), ); foreach ( $types as $slug ) { $definition = (array) get_post_type_object( $slug ); $definition['show_in_rest'] = true; $definition['rest_controller_class'] = 'WP_REST_Posts_Controller'; register_post_type( $slug, $definition ); } } add_action( 'bbp_register_post_types', 'bbpress_enable_rest_api', 11 );
Beyond that, the links you shared (in terms of mixing in extra info such as the author’s details) look solid to me π
My replies seem to keep disappearing into the bbPress void … trying again just to see if this one will show up.
What do you know, it worked!
So getting back to business – thanks for catching that error in my earlier snippet, Robin. I think yours is perfectly fine (also, great links re adding author meta) but just to ‘close the circle’ on my own snippet, here’s a revision:
function bbpress_enable_rest_api() { $types = array( bbp_get_reply_post_type(), bbp_get_forum_post_type(), bbp_get_topic_post_type(), ); foreach ( $types as $slug ) { $definition = (array) get_post_type_object( $slug ); $definition['show_in_rest'] = true; $definition['rest_controller_class'] = 'WP_REST_Posts_Controller'; register_post_type( $slug, $definition ); } } add_action( 'bbp_register_post_types', 'bbpress_enable_rest_api', 11 );
Additionally, as an example of how you can add pretty much anything you want to the JSON responses returned by the REST API:
function bbpress_rest_api_replies_extra_data( WP_REST_Response $response ) { if ( ! is_array( $response->data ) ) { return $response; } foreach ( $response->data as $key => $single_item ) { // Only modify replies if ( bbp_get_reply_post_type() !== $single_item['type'] ) { continue; } // Add the author's details using a custom format $author_id = get_post( $single_item['id'] )->post_author; $author = get_user_by( 'ID', $author_id ); $response->data[ $key ]['author'] = "{$author->display_name} <{$author->user_email}>"; } return $response; } add_filter( 'rest_request_after_callbacks', 'bbpress_rest_api_replies_extra_data' );
You could say this is a bit of a brute force hack and although when combined with my last snippet it successfully adds the author’s display name and email address to replies (not topics), it shouldn’t really be used for that purpose “as is”: it doesn’t escape the author details, you probably don’t want to expose their email addresses, plus it’s out of alignment with how author meta is returned for other post types … However, I felt it was worth sharing an example of how you can quite quickly add arbitrary fields to REST API output.
@barryhughes-1 thanks for posting back, and for the examples.
This is a whole new area, and whilst I am only interested out of eerrrmmm… interest, if others come up with things they need to achieve, I might be tempted to do a bit more.
thanks again for your valuable contributions !!
Absolutely – I’m also still exploring this new territory, nice to have an ‘excuse’ to do so π
Apologies @barryhughes-1, Akismet caught your previous posts as spam for some reason /shrug
We’ve got an update that will at least let you know Akismet caught them as spam rather than just an empty void to deploy in the not too distant future π
No worries!
- You must be logged in to reply to this topic.