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.
The discussion revolves around syncing Wordpress and Discourse categories. Evgeniy_Zubrilin requested help on achieving this, and Genyus provided a code snippet as a starting point. However, Evgeniy_Zubrilin encountered a “syntax error” when using the code. Genyus offered an updated version of the code, which should fix the issue. Additionally, Genyus advised Evgeniy_Zubrilin to upgrade their PHP version, as 7.4 is nearing end-of-life.
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!