Sincronizar categorías de Wordpress y Discourse

Hola, ¿podrías ayudarme a sincronizar las categorías de Wordpress y Discourse?

Por ejemplo, cuando un usuario en mi sitio web crea una nueva categoría, quiero que se cree en Discourse, y tanto la publicación como el tema del foro tendrán la misma categoría.

Este código no está completamente probado y necesitaría manejo de errores/verificaciones de seguridad/registro para uso en producción, pero debería servirle para empezar:

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 );
		}
	}
}
1 me gusta

¡Hola, Gary, gracias por tu respuesta!

Lamentablemente, tengo un error “syntax error, unexpected ‘->’ (T_OBJECT_OPERATOR)” en la siguiente línea:

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

La versión de PHP es 7.4, debe funcionar. No tengo idea de la razón por la que ocurre el error.

¿Dije que no estaba probado? :sweat_smile: No puedo ofrecerte mucha ayuda para depurar en este momento, pero aquí tienes una versión actualizada que debería solucionar ese problema, además de eliminar una comprobación redundante en la segunda acción:

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 está a solo unos tres meses de su fin de soporte, así que realmente deberías empezar a planificar la actualización de tu entorno de alojamiento, si aún no lo has hecho :calendar:

Sí, lo hiciste :sweat_smile: Pero el hecho de que no soy bueno programando me hace buscar una solución por todas partes. Aún no he encontrado ningún freelancer, así que esperaba poder hacerlo funcionar por mi cuenta o con tu consejo :slight_smile:

¡Gracias de nuevo, lo revisaré!