Sincronizar categorias do Wordpress e Discourse

Olá, você poderia me ajudar a sincronizar categorias do WordPress e Discourse?

Por exemplo, quando um usuário no meu site cria uma nova categoria, eu quero que ela seja criada no Discourse, e tanto a postagem quanto o tópico do fórum terão a mesma categoria.

Este código não foi totalmente testado e precisaria de tratamento de erros/verificações de segurança/logs para uso em produção, mas deve servir como ponto de partida:

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 o plugin WPDiscourse para gerar uma nova categoria
	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' ) ) {
		// Habilita a publicação no Discourse, apenas durante o salvamento inicial.
		update_post_meta( $object_id, 'publish_to_discourse', true );
		$discourse_publish_option = get_option( 'discourse_publish' );
		// Define a categoria do Discourse com base na categoria do 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 );
		}
	}
}
1 curtida

Ei, Gary, obrigado pela sua resposta!

Infelizmente, recebo um erro “syntax error, unexpected ‘->’ (T_OBJECT_OPERATOR)” na seguinte linha:

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

A versão do PHP é 7.4, deve funcionar. Não tenho ideia do motivo do erro.

Eu avisei que não estava testado, certo? :sweat_smile: Não posso te ajudar muito com a depuração agora, mas aqui está uma versão atualizada que deve corrigir esse problema, além de remover uma verificação redundante na segunda ação:

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 o plugin WPDiscourse para gerar uma nova categoria
	$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' ) ) {
		// Habilita a publicação no Discourse, apenas durante o salvamento inicial.
		update_post_meta( $object_id, 'publish_to_discourse', true );
		$discourse_publish_option = get_option( 'discourse_publish' );
		// Define a categoria do Discourse com base na categoria do 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 está a apenas três meses do fim de vida (EOL), então você realmente deveria começar a planejar a atualização do seu ambiente de hospedagem, se ainda não o fez :calendar:

Sim, você fez :sweat_smile: Mas o fato de eu não ser bom em codificação me faz procurar uma solução em todos os lugares. Ainda não encontrei nenhum freelancer, então esperava conseguir resolver sozinho ou com seu conselho :slight_smile:

Obrigado novamente, vou verificar!