Hey, could you help me how to sync Wordpress and Discourse categories?
E.g., when user on my website create new category, I want it to be created in Discourse, and both post and forum topic will have the same category.
Hey, could you help me how to sync Wordpress and Discourse categories?
E.g., when user on my website create new category, I want it to be created in Discourse, and both post and forum topic will have the same category.
This code isn’t fully tested and would need error handling/safety checks/logging for production use, but should get you started:
add_action( 'create_category', 'discourse_create_category', 10, 1 );
function discourse_create_category( $term_id ) {
$category = get_term_by( 'id', $term_id, 'category' );
$name = $category->name;
$path = '/categories.json';
// Use the WPDiscourse plugin to generate a new category
new \WPDiscourse\Utilities\PublicPluginUtilities()->discourse_request(
$path,
[
'method' => 'POST',
'name' => $name,
]
);
}
add_action( 'set_object_terms', 'discourse_set_object_terms', 10, 1 );
function discourse_set_object_terms( $object_id ) {
if ( ! metadata_exists( 'post', $object_id, 'publish_to_discourse' ) ) {
// Enable publishing in Discourse, during initial save only.
update_post_meta( $object_id, 'publish_to_discourse', true );
$discourse_publish_option = get_option( 'discourse_publish' );
// set the Discourse category based on WP category
if ( is_array( $discourse_publish_option ) && array_key_exists( 'publish-category', $discourse_publish_option ) ) {
$categories_list = wp_get_post_categories( $object_id );
update_post_meta( $object_id, 'publish_post_category', $categories_list[0]->name );
}
}
}
Hey, Gary, thank you for your answer!
Unfortunately I have an error “syntax error, unexpected ‘->’ (T_OBJECT_OPERATOR)” for the following line:
new \WPDiscourse\Utilities\PublicPluginUtilities()->discourse_request(
The PHP version is 7.4, it must work. I don’t have the idea about the reason error occurs.
I did say it was untested, right? I can’t offer you too much help with debugging right now, but here’s an updated version that should fix that issue as well as removing a redundant check in the second action:
add_action( 'create_category', 'discourse_create_category', 10, 1 );
function discourse_create_category( $term_id ) {
$category = get_term_by( 'id', $term_id, 'category' );
$name = $category->name;
$path = '/categories.json';
// Use the WPDiscourse plugin to generate a new category
$utils = new \WPDiscourse\Utilities\PublicPluginUtilities();
$utils->discourse_request(
$path,
[
'method' => 'POST',
'name' => $name,
]
);
}
add_action( 'set_object_terms', 'discourse_set_object_terms', 10, 1 );
function discourse_set_object_terms( $object_id ) {
if ( ! metadata_exists( 'post', $object_id, 'publish_to_discourse' ) ) {
// Enable publishing in Discourse, during initial save only.
update_post_meta( $object_id, 'publish_to_discourse', true );
$discourse_publish_option = get_option( 'discourse_publish' );
// set the Discourse category based on WP category
if ( is_array( $discourse_publish_option ) ) {
$categories_list = wp_get_post_categories( $object_id );
update_post_meta( $object_id, 'publish_post_category', $categories_list[0]->name );
}
}
}
7.4 is only about three months away from EOL, so you should really start planning to upgrade your hosting environment, if you haven’t already
Yeah, you did But the fact that I am not well at coding makes me look everywhere for a solution. I haven’t found any freelancer yet, so I was hoping to make it work by myself or with your advice
Thank you again, I’ll check!