Utiliza WP Discourse para publicar publicaciones de WordPress a Discourse

You can use the WP Discourse Plugin to Publish Wordpress Posts to your Discourse so your community can talk about your Wordpress content. Before you can set up Publishing you first have to install the WP Discourse plugin on Wordpress and connect it to your Discourse. If you’re ready to get started, start by watching this short video, or follow the instructions below.

Next Step

Once you’ve set up publishing, you may want to check out the following topics


Instructions

Publishing Settings

:warning: Make sure you always save your settings after changing them. Click the ‘Save Options’ button at the bottom of the page.

The settings should be relatively self-explanatory. If you’re having an issue understanding any of them please reply to this topic for a further clarification.

Default Discourse Category

Sets the default category in which your posts will be published on Discourse. This setting can be overridden for individual posts on the WordPress post-new screen.

Display Subcategories

Indicates whether or not you want your forum’s subcategories to be available as categories that you can publish to from WordPress. You will need to save this setting before subcategories become available in the Default Discourse Category option input.

Force Category Update

For when you have added new categories to your forum and would like them to be available on your WordPress site. Enabling this setting and saving the options page makes a single API call to Discourse to retrieve the Discourse categories. After enabling it, the next time you navigate back to the Commenting tab, you will find the setting disabled.

Allow Tags

Enable this if you would like to add tags to Discourse topics that are created via WordPress.

Publish as Unlisted Topics

Will cause posts published from WordPress to be unlisted on Discourse. If you enable the Sync Comment Data webhook setting, unlisted posts will be made visible when they first receive a reply on Discourse.

Use Full Post Content

Let’s you publish full WordPress posts, rather than excerpts, to your Discourse forum. To keep the Show Full Post button from appearing under your post on Discourse, you must un-select the embed truncate site setting on Discourse (found at yourforum.com/admin/site_settings/category/posting.)

Custom Excerpt Length

If you have not selected the Use Full Post Content setting, this setting will create excerpts of that length to be published to Discourse. You can also manually create excerpts when you create a WordPress post by adding the excerpt to the Excerpt meta-box.

Auto Publish

This pre-check’s the Publish to Discourse checkbox that appears on the post-new screen for post-types that are to be published to Discourse. The checkbox can still be un-checked when creating the post.

Auto Track Published Topics

This setting is enabled by default. When enabled, the author of a post published to Discourse from WordPress will automatically be ‘Watching’ the topic (they will receive Discourse notifications about every new reply)

Post Types to Publish

This setting must be set. It defaults to post, but pages and custom post types may also be selected.

Exclude Posts By Tag

If you add Wordpress tags to this setting, any Wordpress post with one of the tags will not be published to Discourse.

Do Not Display Discourse Name Field

This will hide the “Discourse Username” field in user’s profiles. The Discourse Username is used to set the author of the topic when publishing posts to Discourse.

Discourse Username Editable

This determines whether non-admins are able to edit their own Discourse Username in their profile. The Discourse Username is used to set the author of the topic when publishing posts to Discourse.

Direct Database Publication Flags

This setting is used in certain setups that have specialized Wordpress environments. Don’t use this setting unless you know what it does.

Verbose Publication Logs

Enabling this setting will mean that all posts published to Discourse are logged in the WP Discourse logs, even if they succeed. Normally only errors are logged.

Enable posting by XMLRPC

XML-RPC is a remote procedure call that is often used by blogging software for sending posts to WordPress. Apps that use this procedure include the wordpress.com blogging app.

By default, WP Discourse will not publish posts to Discourse that are created through XML-RPC. The reason for this is that there is no great way to indicate whether a post published through blogging software is meant to be published on Discourse.

If you would like to use blogging software for creating posts that are directly published to Discourse, you need to add some code to your theme’s functions.php file that hooks into the wp_discourse_before_xmlrpc_publish filter. The wp_discourse_before_xmlrpc_publish filter passes two arguments to functions that hook into it. The first argument, $publish_to_discourse is a boolean that is set to false to disable publishing by XML-RPC. The second argument is the post object.

To have all XML-RPC posts automatically published by Discourse you need to write a function that will always return true. Use something like the following code:

Warning: this will cause all posts published through XML-RPC to be published to Discourse, this will include old posts that are edited on blogging software.

add_filter('wp_discourse_before_xmlrpc_publish', 'my_namespace_xmlrpc_publish', 10, 2 );
function my_namespace_xmlrpc_publish( $publish_to_discourse, $post ) {
  return true;
}

Filtering XML-RPC posts by post tag

The wordpress.com blogging app allows you to add tags to posts. Tags can be used to control whether or not a post is published to Discourse. To only publish posts that have a ‘discourse’ tag, use something like this:

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;
}

If you would like to use this method, but not have the discourse tag appear in your published posts, you can remove it with some code like this:

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;
}

Filtering XML-RPC posts by post date

To only allow posts published after a certain date to be published to Discourse through XML-RPC, add some code like this to your functions.php file. This code will allow all posts published after January 1, 2016 to be published to 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;
}

Todo: add a filter to the wp-discourse plugin to allow for only publishing new posts (as opposed to edited posts) through XML-RPC.

Filtering the available categories for a custom post type

Before the Discourse categories are displayed in the Publish to Discourse meta-box on the Wordpress admin/post-new page, the Wordpress filter 'wp_discourse_publish_categories' is applied to them. It is given the Discourse categories array, and the current post as arguments. This can be used in your theme’s functions.php file to limit which categories are available for a given post type.

Here is an example that creates an 'acme_product' post type and then returns the Discourse categories ‘fun’ and ‘scratch’ to be displayed in the Publish to Discourse meta-box for posts of that type.

// Create the post type.
add_action(  'init', 'my_namespace_create_post_type' );
function my_namespace_create_post_type() {
  register_post_type( 'acme_product',
    array(
      'labels' => array(
      'name' => __( 'Products' ),
      'singular_name' => __( 'Product' )
    ),
    'public' => true,
    'supports' => array( 'title', 'editor', 'comments', 'custom-fields' ),
    'has_archive' => true,
    'show_in_rest' => true,
    )
  );
}

// Filter the available categories for the 'acme_product' post type.
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;
}

If you want to strictly apply a specific category to specific post types (i.e. 1:1) then you should use wpdc_publish_post_category instead.

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' );

Display metadata of a connected Discourse topic

When you have Publishing set up you can display metadata about the Discourse topic by using Template Customisation.

First, you need to decide which template you wish to modify. If, for example, you only wish to show topic metadata, and no replies as comments, then you’ll want to modify the no_replies template.

Once you’ve chosen a template, you can modify it to add Discourse topic metadata. Here’s a snippet that does that, with some comments explaining what the code is doing

// ensure wp-discourse is present using your preferred method,
// e.g. https://wordpress.stackexchange.com/questions/127818/how-to-make-a-plugin-require-another-plugin

// Require the plugin-utilities from the wp-discourse plugin
require_once ABSPATH . 'wp-content/plugins/wp-discourse/lib/plugin-utilities.php';
use WPDiscourse\Shared\PluginUtilities;

// Encapsulate your topic metadata template in a class so you can easily include the plugin utilities
class DiscourseTopicMetadata {
  
  // Include the wp plugin utilities in your class
  use PluginUtilities;
  
  public function __construct() {

    // Add the template filter on the initialization of the class
    add_filter( 'discourse_no_replies_html', array( $this, 'topic_metadata_html' ) );
  }

  function topic_metadata_html( $input ) {
    // Get the discourse permalink from the post metadata
    $discourse_permalink = get_post_meta( get_the_ID(), 'discourse_permalink', true );

    // Use the discourse permanlink to get the topic JSON from Discourse, using the helper method from the plugin utilities which handles authorization for you
    $topic = $this->get_discourse_topic($discourse_permalink);
   
    // Output your markup, including which topic metadata you wish to display
    ob_start();
    ?>
    <div id="discourse-topic-meta">
        <div class="views">
          Views
          <?php echo $topic->views; ?>
        </div>
        <div class="replies">
          Replies
          <?php echo $topic->reply_count; ?>
        </div>
    </div>
    <?php
    
    return ob_get_clean();
  }
}

// Instantiate the class to add the filter
new DiscourseTopicMetadata();

For more details on what topic metadata is available in the response from get_discourse_topic see Discourse API Docs.

9 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