Puedes usar el plugin WP Discourse para publicar entradas de WordPress en tu Discourse, de modo que tu comunidad pueda hablar sobre tu contenido de WordPress. Antes de configurar la publicación, primero debes instalar el plugin WP Discourse en WordPress y conectarlo con tu Discourse. Si estás listo para comenzar, empieza viendo este breve video o sigue las instrucciones a continuación.
Siguiente paso
Una vez que hayas configurado la publicación, es posible que quieras consultar los siguientes temas:
- Usar Discourse para comentarios de WordPress
- Iniciar sesión en Discourse con WordPress (DiscourseConnect)
Instrucciones
Configuración de publicación
Asegúrate de guardar siempre tus configuraciones después de modificarlas. Haz clic en el botón «Guardar opciones» al final de la página.
Las configuraciones deberían ser relativamente autoexplicativas. Si tienes alguna dificultad para entender alguna de ellas, responde a este tema para obtener más aclaraciones.
Categoría predeterminada de Discourse
Establece la categoría predeterminada en la que se publicarán tus entradas en Discourse. Esta configuración puede sobrescribirse para entradas individuales en la pantalla de nueva entrada de WordPress.
Mostrar subcategorías
Indica si deseas que las subcategorías de tu foro estén disponibles como categorías a las que puedas publicar desde WordPress. Deberás guardar esta configuración antes de que las subcategorías estén disponibles en el campo de entrada de la opción Categoría predeterminada de Discourse.
Forzar actualización de categoría
Útil cuando has agregado nuevas categorías a tu foro y deseas que estén disponibles en tu sitio de WordPress. Al activar esta configuración y guardar la página de opciones, se realiza una única llamada a la API de Discourse para recuperar las categorías de Discourse. Después de activarla, la próxima vez que navegues a la pestaña de Comentarios, encontrarás la configuración desactivada.
Permitir etiquetas
Activa esta opción si deseas agregar etiquetas a los temas de Discourse creados desde WordPress.
Publicar como temas no listados
Hará que las entradas publicadas desde WordPress sean no listadas en Discourse. Si activas la configuración del webhook «Sincronizar datos de comentarios», las entradas no listadas se harán visibles cuando reciban su primera respuesta en Discourse.
Usar contenido completo de la entrada
Te permite publicar entradas completas de WordPress, en lugar de extractos, en tu foro de Discourse. Para evitar que aparezca el botón «Mostrar entrada completa» debajo de tu entrada en Discourse, debes desmarcar la configuración del sitio «Recortar incrustación» en Discourse (en tuforo.com/admin/site_settings/category/posting).
Longitud personalizada del extracto
Si no has seleccionado la configuración «Usar contenido completo de la entrada», esta opción creará extractos de esa longitud para publicar en Discourse. También puedes crear extractos manualmente al crear una entrada de WordPress agregando el extracto al cuadro de metadatos «Extracto».
Publicación automática
Marca automáticamente la casilla «Publicar en Discourse» que aparece en la pantalla de nueva entrada para los tipos de entrada que deben publicarse en Discourse. La casilla aún puede desmarcarse al crear la entrada.
Seguimiento automático de temas publicados
Esta configuración está activada de forma predeterminada. Cuando está activada, el autor de una entrada publicada en Discourse desde WordPress será automáticamente «Observador» del tema (recibirá notificaciones de Discourse sobre cada nueva respuesta).
Tipos de entrada a publicar
Esta configuración debe establecerse. Por defecto es «entrada», pero también se pueden seleccionar páginas y tipos de entrada personalizados.
Excluir entradas por etiqueta
Si agregas etiquetas de WordPress a esta configuración, cualquier entrada de WordPress con una de esas etiquetas no se publicará en Discourse.
No mostrar campo de nombre de Discourse
Esto ocultará el campo «Nombre de usuario de Discourse» en los perfiles de los usuarios. El nombre de usuario de Discourse se utiliza para establecer el autor del tema al publicar entradas en Discourse.
Nombre de usuario de Discourse editable
Determina si los usuarios que no son administradores pueden editar su propio nombre de usuario de Discourse en su perfil. El nombre de usuario de Discourse se utiliza para establecer el autor del tema al publicar entradas en Discourse.
Indicadores de publicación directa en base de datos
Esta configuración se utiliza en ciertos entornos con configuraciones especializadas de WordPress. No la uses a menos que sepas qué hace.
Registros detallados de publicación
Al activar esta configuración, todas las entradas publicadas en Discourse se registrarán en los registros de WP Discourse, incluso si tienen éxito. Normalmente solo se registran los errores.
Habilitar publicación mediante XML-RPC
XML-RPC es una llamada a procedimiento remoto que a menudo utilizan los sistemas de blogging para enviar entradas a WordPress. Aplicaciones que utilizan este procedimiento incluyen la aplicación de blogging de wordpress.com.
De forma predeterminada, WP Discourse no publicará en Discourse las entradas creadas mediante XML-RPC. La razón es que no hay una buena manera de indicar si una entrada publicada a través de software de blogging está destinada a publicarse en Discourse.
Si deseas usar software de blogging para crear entradas que se publiquen directamente en Discourse, debes agregar algo de código al archivo functions.php de tu tema que se conecte al filtro wp_discourse_before_xmlrpc_publish. El filtro wp_discourse_before_xmlrpc_publish pasa dos argumentos a las funciones que se conectan a él. El primer argumento, $publish_to_discourse, es un valor booleano que se establece en false para desactivar la publicación mediante XML-RPC. El segundo argumento es el objeto post.
Para que todas las entradas XML-RPC se publiquen automáticamente en Discourse, debes escribir una función que siempre devuelva true. Usa algo como el siguiente código:
Advertencia: esto hará que todas las entradas publicadas mediante XML-RPC se publiquen en Discourse, incluidas las entradas antiguas que se editen en el software de blogging.
add_filter('wp_discourse_before_xmlrpc_publish', 'my_namespace_xmlrpc_publish', 10, 2 );
function my_namespace_xmlrpc_publish( $publish_to_discourse, $post ) {
return true;
}
Filtrar entradas XML-RPC por etiqueta de entrada
La aplicación de blogging de wordpress.com permite agregar etiquetas a las entradas. Las etiquetas pueden usarse para controlar si una entrada se publica o no en Discourse. Para publicar solo las entradas que tengan la etiqueta «discourse», usa algo como esto:
add_filter('wp_discourse_before_xmlrpc_publish', 'my_namespace_xmlrpc_publish_by_tag', 10, 2 );
function my_namespace_xmlrpc_publish_by_tag( $publish_to_discourse, $post ) {
if ( has_tag( 'discourse', $post ) ) {
return true;
}
return false;
}
Si deseas usar este método pero no quieres que la etiqueta discourse aparezca en tus entradas publicadas, puedes eliminarla con un código como este:
add_filter( 'term_links-post_tag', 'my_prefix_remove_discourse_tag' );
function my_prefix_remove_discourse_tag( $tags ) {
foreach( $tags as $key => $value ) {
if ( strpos( $value, 'discourse' ) ) {
unset( $tags[ $key ] );
}
}
return $tags;
}
Filtrar entradas XML-RPC por fecha de entrada
Para permitir solo que las entradas publicadas después de una fecha determinada se publiquen en Discourse mediante XML-RPC, agrega algo de código como este a tu archivo functions.php. Este código permitirá que todas las entradas publicadas después del 1 de enero de 2016 se publiquen en Discourse.
add_filter('wp_discourse_before_xmlrpc_publish', 'my_namespace_xmlrpc_publish_by_date', 10, 2 );
function my_namespace_xmlrpc_publish_by_date( $publish_to_discourse, $post ) {
if ( strtotime( $post->post_date ) > strtotime( '2016-01-01') ) {
return true;
}
return false;
}
Pendiente: agregar un filtro al plugin wp-discourse para permitir publicar solo entradas nuevas (en lugar de entradas editadas) mediante XML-RPC.
Filtrar las categorías disponibles para un tipo de entrada personalizado
Antes de que las categorías de Discourse se muestren en el cuadro de metadatos «Publicar en Discourse» en la página admin/post-new de WordPress, se aplica el filtro de WordPress 'wp_discourse_publish_categories'. Se le pasa el array de categorías de Discourse y la entrada actual como argumentos. Esto puede usarse en el archivo functions.php de tu tema para limitar qué categorías están disponibles para un tipo de entrada determinado.
Aquí hay un ejemplo que crea un tipo de entrada 'acme_product' y luego devuelve las categorías de Discourse «fun» y «scratch» para mostrarlas en el cuadro de metadatos Publicar en Discourse para entradas de ese tipo.
// Crear el tipo de entrada.
add_action( 'init', 'my_namespace_create_post_type' );
function my_namespace_create_post_type() {
register_post_type( 'acme_product',
array(
'labels' => array(
'name' => __( 'Productos' ),
'singular_name' => __( 'Producto' )
),
'public' => true,
'supports' => array( 'title', 'editor', 'comments', 'custom-fields' ),
'has_archive' => true,
'show_in_rest' => true,
)
);
}
// Filtrar las categorías disponibles para el tipo de entrada 'acme_product'.
add_filter( 'wp_discourse_publish_categories', 'my_namespace_filter_categories', 10, 2 );
function my_namespace_filter_categories( $categories, $post ) {
if ( 'acme_product' === get_post_type( $post ) ) {
$output = [];
foreach ( $categories as $category ) {
if ( 'fun' === $category['name'] || 'scratch' === $category['name'] ) {
$output[] = $category;
}
}
return $output;
}
return $categories;
}
Si deseas aplicar estrictamente una categoría específica a tipos de entrada específicos (es decir, 1:1), entonces debes usar wpdc_publish_post_category en su lugar.
function wpdc_change_post_category( $category, $post_id ) {
if ( 'acme_product' === get_post_type( $post ) ) {
$categories = WPDiscourse\Utilities\Utilities::get_discourse_categories();
$fun_category = array_search( 'fun' , array_column( $categories, 'name' ));
return $fun_category;
} else {
return $category;
}
}
add_filter( 'wpdc_publish_post_category', 'wpdc_change_post_category' );
Mostrar metadatos de un tema conectado de Discourse
Cuando tengas configurada la publicación, puedes mostrar metadatos sobre el tema de Discourse usando Personalización de plantillas.
Primero, debes decidir qué plantilla deseas modificar. Si, por ejemplo, solo deseas mostrar metadatos del tema y ninguna respuesta como comentarios, entonces querrás modificar la plantilla no_replies.
Una vez que hayas elegido una plantilla, puedes modificarla para agregar metadatos del tema de Discourse. Aquí hay un fragmento que lo hace, con algunos comentarios que explican qué hace el código:
// Asegúrate de que wp-discourse esté presente usando tu método preferido,
// por ejemplo, https://wordpress.stackexchange.com/questions/127818/how-to-make-a-plugin-require-another-plugin
// Requerir las utilidades del plugin desde el plugin wp-discourse
require_once ABSPATH . 'wp-content/plugins/wp-discourse/lib/plugin-utilities.php';
use WPDiscourse\Shared\PluginUtilities;
// Encapsula tu plantilla de metadatos del tema en una clase para poder incluir fácilmente las utilidades del plugin
class DiscourseTopicMetadata {
// Incluir las utilidades del plugin de WordPress en tu clase
use PluginUtilities;
public function __construct() {
// Agregar el filtro de plantilla al inicializar la clase
add_filter( 'discourse_no_replies_html', array( $this, 'topic_metadata_html' ) );
}
function topic_metadata_html( $input ) {
// Obtener el enlace permanente de Discourse desde los metadatos de la entrada
$discourse_permalink = get_post_meta( get_the_ID(), 'discourse_permalink', true );
// Usar el enlace permanente de Discourse para obtener el JSON del tema de Discourse, usando el método auxiliar de las utilidades del plugin que maneja la autorización por ti
$topic = $this->get_discourse_topic($discourse_permalink);
// Generar tu marcado, incluyendo qué metadatos del tema deseas mostrar
ob_start();
?>
<div id="discourse-topic-meta">
<div class="views">
Vistas
<?php echo $topic->views; ?>
</div>
<div class="replies">
Respuestas
<?php echo $topic->reply_count; ?>
</div>
</div>
<?php
return ob_get_clean();
}
}
// Instanciar la clase para agregar el filtro
new DiscourseTopicMetadata();
Para más detalles sobre qué metadatos del tema están disponibles en la respuesta de get_discourse_topic, consulta Discourse API Docs.

