Utiliza WP Discourse para publicar publicaciones de WordPress a Discourse

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:


Instrucciones

Configuración de publicación

:warning: 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.

10 Me gusta

¿Se pueden importar entradas de blog publicadas anteriormente? ¿Por ejemplo, entradas de blog de los últimos 30 días? Solo para poblar un poco esa categoría. Gracias.

2 Me gusta

Por el momento no hay una opción de importación masiva. Aún puedes lograr esto editando cada una de las publicaciones antiguas y publicándolas en Discourse.

2 Me gusta

Estoy configurando mis sitios para que solo unas pocas personas inicien sesión en WordPress (autores), pero Discourse está bastante abierto a cualquiera. Discourse se utiliza para la autenticación.

Me gustaría que los temas creados a partir de artículos muestren el nombre del usuario de Discourse en lugar de “System” (o lo que sea que tenga configurado el Nombre de usuario de publicación).

En otras palabras, el Nombre de usuario de publicación está configurado como “System”. Joe Blow publica un nuevo artículo en WordPress. Joe Blow existe en Discourse (dado que Discourse controla la autenticación, todos los usuarios de WordPress también son usuarios de Discourse). Me gustaría que el tema se muestre como publicado por Joe Blow en lugar de System. Más tarde, en los mismos sitios, Jane Doe publica un artículo, me gustaría que el tema en Discourse se muestre como publicado por Jane Doe en lugar de System.

¿Es esto factible?

No lo sé. Pero si revisas la pestaña Publicar y allí la última opción Publicación de clave API de usuario único — eso es algo que intentaría primero.

Si estás usando DiscourseSSO (o lo que sea que sea o haya sido la conexión…) entonces nadie puede registrarse en tu foro sin pasar por WordPress. Entonces, si WordPress controla la cuenta de los editores en Discourse, ¿cómo lo harías sin exigir primero el registro en WordPress para todos? Tengo curiosidad porque podría usar algo así.

(Y… estoy fuera de tema de nuevo :man_facepalming:)

Usé la configuración del cliente DiscourseConnect. Esto utiliza Discourse como sistema de autenticación y crea el usuario en WordPress si no existe. Según las instrucciones del plugin.

Habilitar tu sitio para que funcione como un cliente DiscourseConnect permite que la autenticación de usuarios de WordPress se gestione a través de tu foro de Discourse o de tu sitio de WordPress. Si un usuario de Discourse inicia sesión en WordPress a través de un enlace de DiscourseConnect, se autenticará en función de sus credenciales de Discourse. Si ese usuario aún no existe en tu sitio de WordPress, se creará un nuevo usuario.

Los usuarios se establecerán inicialmente como suscriptores en WordPress, y yo los estableceré manualmente como autores (según sea necesario). Planeo configurar el sitio de manera que los usuarios no registrados puedan ver todo el contenido, y solo necesitarán registrarse en WP si desean publicar artículos.

Todos los usuarios en WordPress primero tendrán que registrarse en Discourse, luego el conector automáticamente los iniciará sesión en WP, o creará una cuenta y luego los iniciará sesión.

Sí, lo hace, pero anula todas las demás formas de autenticación, y luego un usuario normal del foro debe registrarse en WordPress antes de obtener acceso a Discourse.

¿O estoy entendiendo algo mal?

Por lo que he visto, un usuario habitual de Discourse nunca tiene que ir al sitio de WP. Si deciden seguir un enlace del sitio de Discourse, se registran automáticamente en el sitio de WP.

Eres bienvenido a ver los dos sitios para ver de qué estoy hablando. Ten en cuenta que aún no están completos, pero esa parte funciona ahora.
Https://forum.oursail.boats es Discourse
Https://www.oursail.boats es el sitio de WP.

Crea una cuenta en el sitio de WP. Podrás ver y responder a los mensajes allí.

Luego ve al sitio de WP y selecciona el elemento del menú Iniciar sesión. Omitirá el inicio de sesión de WP y, en su lugar, te conectará al inicio de sesión de Discourse (dependiendo de tu configuración). Si has seleccionado la opción de permanecer conectado, ni siquiera te pedirá que lo hagas. Volverá inmediatamente al sitio de WP después de iniciar sesión.

Solo necesitas asegurarte de que los usuarios que publican los artículos en Wordpress tengan su Discourse Username completado en el perfil del usuario. Si el usuario tiene un Discourse Username, las publicaciones que haga en Wordpress se publicarán en Discourse usando su nombre de usuario.

Puedes actualizar esto manualmente o actualizarlo automáticamente usando el webhook Update Userdata (consulta la configuración de “Webhooks” de WP Discourse).

3 Me gusta

Antes de editar manualmente las 393 publicaciones publicadas en mi WP, solo quería verificar si este sigue siendo el caso. Es decir, ¿que todavía no hay una opción de importación masiva? ¡Gracias!

No hay opción de importación masiva. Ten en cuenta que si publicas 393 publicaciones en Discourse, tendrás 393 borradores de temas. Te aconsejaría que consideres una estrategia más específica. ¿De qué va a hablar realmente tu comunidad ahora?

2 Me gusta

Supongo que no lo harán. Discourse se usa simplemente para reemplazar los comentarios, nada más. Por lo tanto, no es para Discourse, sino para WordPress.

Estuve en una situación similar. Debido a que la mayoría de las publicaciones de WordPress del mundo no captan ningún tipo de comentario, o son más o menos solo ruido, la mía no fue diferente. Pero en lugar de trabajar con todo el contenido, usé mi antiguo WP-content para despertar la actividad en Discourse. No conecté todas las publicaciones a la vez, sino que las fui introduciendo gradualmente. Como ahora hay temas activos sobre insolación en perros y cuántas calorías debes comer en el sendero: publicaciones antiguas que cobraron nueva vida en Discourse.

Si hubiera una opción para conectar todo en bloque, lo haría, sin entender tal potencial perdido. Incluso podría decir que entierres la opción de bloque seis pies bajo tierra, incluso si pudieras codificarla :wink:

2 Me gusta

Solo estoy intentando importar todos los comentarios a Discourse antes de migrar el sitio web de WordPress a Ghost, ya que Ghost no maneja comentarios (aunque puedes conectarlo a Discourse para los comentarios).

Pero se me acaba de ocurrir que si primero conecto mi nuevo Ghost a mi Discourse antes de importar todas mis publicaciones de WordPress, eso podría funcionar… quizás (/yo me voy a intentarlo…)

No migra comentarios de WP a Discourse. Solo muestra publicaciones de Discourse en WordPress.

Si entendí bien…

1 me gusta

No tiene sentido vincular publicaciones de Wordpress y temas de Discourse si estás a punto de migrar a Ghost.

¡Hola a todos!

¡Acabo de completar la configuración de mi comunidad con Discourse! Actualmente estoy probando el plugin WP Discourse en mi sitio de staging.

Tengo una preocupación sobre posibles problemas de SEO. Específicamente, al publicar el mismo contenido de WP en Discourse, me preocupa la duplicación de contenido según los problemas de SEO. ¿Discourse marca el contenido del foro como una copia a efectos de SEO?

Hola Victor :slight_smile:

Deberías estar bien en cuanto a SEO con la configuración predeterminada (ya que son dominios diferentes), pero también puedes establecer la URL canónica del tema de Discourse en la URL de la publicación de WordPress.

Habilita el ajuste del sitio de Discourse embed set canonical url, entonces el permalink de la publicación de WP será la URL canónica del tema de Discourse (es decir, aparecerá en el head del HTML del tema de Discourse como el enlace canónico).

Para más contexto sobre esto, consulta

1 me gusta

Gracias @angus. Realmente lo aprecio. Para mí, ¡es más seguro tomar el control con SEO que dejarlo al azar!

1 me gusta

Estoy intentando establecer diferentes categorías para diferentes custom_post_types. El código a continuación selecciona la categoría correcta en el administrador de WordPress. Sin embargo, al publicar en Discourse, la categoría no se establece allí (y se establece por defecto en “sin categorizar”)…

¿Quizás me estoy perdiendo algo obvio?

// WP Discourse establece categorías de foro CPT para CPTS
 
add_filter( 'wp_discourse_publish_categories', 'radhr_filter_categories_policies', 10, 2 );
function radhr_filter_categories( $categories, $post ) {
	if ( 'policy' === get_post_type( $post ) ) {
		$output = [];
		foreach ( $categories as $category ) {
			if ( 'Policies' === $category['name']) {
				$output[] = $category;
			}
		}
		return $output;
	} 
	
	elseif ( 'guide' === get_post_type( $post ) ) {
		$output = [];
		foreach ( $categories as $category ) {
			if ( 'Guides' === $category['name']) {
				$output[] = $category;
			}
		}
		return $output;
	}
	
	elseif ( 'post' === get_post_type( $post ) ) {
		$output = [];
		foreach ( $categories as $category ) {
			if ( 'Blogs' === $category['name']) {
				$output[] = $category;
			}
		}
		return $output;
	}

	return $categories;
}

Hiciste una suposición razonable sobre cómo lograr tu objetivo, pero wp_discourse_publish_categories no funcionará de manera confiable si estás filtrando a una sola categoría con el editor de Gutenberg.

Deberías usar wpdc_publish_post_category en su lugar:

Actualizaré el OP para anotarlo.

1 me gusta