Синхронизация категорий WordPress и Discourse

Привет! Подскажи, пожалуйста, как синхронизировать категории WordPress и Discourse?

Например, когда пользователь на моём сайте создаёт новую категорию, я хочу, чтобы она автоматически создавалась и в Discourse, чтобы и пост, и тема форума имели одну и ту же категорию.

Этот код не полностью протестирован и требует обработки ошибок, проверок безопасности и ведения журналов для использования в продакшене, но поможет вам начать:

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';
	// Используйте плагин WPDiscourse для создания новой категории
	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' ) ) {
		// Включить публикацию в Discourse только при первом сохранении.
		update_post_meta( $object_id, 'publish_to_discourse', true );
		$discourse_publish_option = get_option( 'discourse_publish' );
		// Установить категорию Discourse на основе категории WP
		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 );
		}
	}
}

Привет, Гэри, спасибо за ваш ответ!

К сожалению, у меня возникает ошибка «syntax error, unexpected ‘->’ (T_OBJECT_OPERATOR)» для следующей строки:

new \WPDiscourse\Utilities\PublicPluginUtilities()->discourse_request(

Версия PHP — 7.4, это должно работать. У меня нет представления о причине возникновения этой ошибки.

Я же говорил, что это не протестировано, верно? :sweat_smile: Сейчас я не могу сильно помочь с отладкой, но вот обновлённая версия, которая должна исправить эту проблему, а также убирает избыточную проверку во втором действии:

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';
	// Используйте плагин WPDiscourse для создания новой категории
	$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' ) ) {
		// Включите публикацию в Discourse только при первом сохранении.
		update_post_meta( $object_id, 'publish_to_discourse', true );
		$discourse_publish_option = get_option( 'discourse_publish' );
		// Установите категорию Discourse на основе категории WP
		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 остаётся всего около трёх месяцев, поэтому вам действительно стоит начать планировать обновление вашей хостинг-среды, если вы ещё этого не сделали :calendar:

Да, вы правы :sweat_smile: Но тот факт, что я не очень хорошо разбираюсь в программировании, заставляет меня искать решение повсюду. Я пока не нашел ни одного фрилансера, поэтому надеялся справиться сам или с вашей помощью :slight_smile:

Еще раз спасибо, я проверю!