Utilisez WP Discourse pour publier des posts de Wordpress vers 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 « J'aime »

Est-il possible d’importer des articles de blog précédemment publiés ? Par exemple, des articles de blog des 30 derniers jours ? Juste pour peupler un peu cette catégorie. Merci.

2 « J'aime »

Il n’y a pas d’option d’importation en masse pour le moment. Vous pouvez toujours y parvenir en modifiant chacun des anciens articles et en les publiant sur Discourse.

2 « J'aime »

Je configure mes sites de manière à ce que seules quelques personnes se connectent à WordPress (auteurs), mais Discourse est pratiquement ouvert à tous. Discourse est utilisé pour l’authentification.

J’aimerais que les sujets créés à partir des articles affichent le nom de l’utilisateur Discourse au lieu de « Système » (ou de ce que j’ai défini pour le Nom d’utilisateur de publication).

En d’autres termes, le Nom d’utilisateur de publication est défini sur « Système ». Joe Blow publie un nouvel article dans WordPress. Joe Blow existe dans Discourse (puisque Discourse contrôle l’authentification, tous les utilisateurs WordPress sont également des utilisateurs Discourse). J’aimerais que le sujet soit affiché comme publié par Joe Blow au lieu de Système. Plus tard, sur les mêmes sites, Jane Doe publie un article, j’aimerais que le sujet dans Discourse soit affiché comme publié par Jane Doe au lieu de Système.

Est-ce réalisable ?

Je ne sais pas. Mais si vous consultez l’onglet Publish et là la dernière option Single User API Key Publication — c’est quelque chose que j’essaierais en premier.

Si vous utilisez DiscourseSSO (ou n’importe quelle connexion que c’est ou était…) alors personne ne peut s’enregistrer sur votre forum sans passer par WordPress. Donc, si WordPress contrôle le compte des éditeurs sur Discourse, comment feriez-vous cela sans exiger d’abord l’enregistrement sur WordPress pour tout le monde ? Je suis curieux car je pourrais utiliser quelque chose comme ça.

(Et… je suis encore hors sujet :man_facepalming:)

J’ai utilisé le paramètre du client DiscourseConnect. Celui-ci utilise Discourse comme système d’authentification et crée l’utilisateur dans WordPress s’il n’existe pas. D’après les instructions du plugin.

« Permettre à votre site de fonctionner comme un client DiscourseConnect permet à l’authentification des utilisateurs WordPress d’être gérée soit par votre forum Discourse, soit par votre site WordPress. Si un utilisateur Discourse se connecte à WordPress via un lien DiscourseConnect, il sera authentifié sur la base de ses identifiants Discourse. Si cet utilisateur n’existe pas encore sur votre site WordPress, un nouvel utilisateur sera créé. »

Les utilisateurs seront initialement définis comme abonnés dans WordPress, et je les définirai manuellement comme auteurs (selon les besoins). Je prévois de configurer le site de manière à ce que les utilisateurs non enregistrés puissent voir tout le contenu, et n’auront vraiment besoin de s’inscrire dans WP que s’ils souhaitent publier des articles.

Tous les utilisateurs de WordPress devront d’abord s’inscrire dans Discourse, puis le connecteur les connectera automatiquement à WP, ou créera un compte puis les connectera.

Oui, mais cela remplace toutes les autres méthodes d’authentification, et ensuite un utilisateur normal du forum doit s’inscrire sur WordPress avant d’avoir accès à Discourse.

Ou est-ce que je comprends mal quelque chose ?

D’après ce que j’ai vu, un utilisateur régulier de Discourse n’a jamais à se rendre sur le site WP. S’il décide de suivre un lien du site Discourse, il est automatiquement enregistré sur le site WP.

N’hésitez pas à consulter les deux sites pour voir de quoi je parle. Gardez à l’esprit qu’ils ne sont pas encore terminés, mais cette partie fonctionne maintenant.
Https://forum.oursail.boats est le Discourse
Https://www.oursail.boats est le site WP.

Créez un compte sur le site WP. Vous pourrez voir et répondre aux messages là-bas.

Ensuite, allez sur le site WP et sélectionnez l’élément de menu Connexion. Il contournera la connexion WP et vous connectera à la connexion Discourse (selon vos paramètres). Si vous avez sélectionné l’option pour rester connecté, il ne vous le demandera même pas. Il retournera immédiatement sur le site WP après vous avoir connecté.

Il vous suffit de vous assurer que les utilisateurs qui publient les articles sur Wordpress ont leur nom d’utilisateur Discourse renseigné dans le profil de l’utilisateur. Si l’utilisateur a un nom d’utilisateur Discourse, les publications qu’il effectue dans Wordpress seront publiées sur Discourse en utilisant son nom d’utilisateur.

Vous pouvez le mettre à jour manuellement ou automatiquement à l’aide du webhook Update Userdata (voir les paramètres « Webhooks » de WP Discourse).

3 « J'aime »

Avant de modifier manuellement les 393 articles publiés sur mon WP, je voulais juste vérifier s’il en est toujours ainsi ? C’est-à-dire qu’il n’y a toujours pas d’option d’importation en masse ? Merci !

Il n’y a pas d’option d’importation en masse. Gardez à l’esprit que si vous publiez 393 messages sur Discourse, vous aurez 393 ébauches de sujets. Je vous conseillerais d’envisager une stratégie plus ciblée. De quoi votre communauté va-t-elle réellement discuter maintenant ?

2 « J'aime »

Je suppose qu’ils ne le feront pas. Discourse est juste utilisé pour remplacer les commentaires, rien d’autre. Donc, ce n’est pas pour Discourse, mais pour WordPress.

J’étais dans une situation similaire. Parce que la plupart des articles WordPress du monde ne reçoivent aucun commentaire, ou que ceux-ci ne sont plus que du bruit, le mien n’a pas fait exception. Mais au lieu de travailler avec tout le contenu, j’utilisais mon ancien WP-content pour réveiller l’activité sur Discourse. Je n’ai pas connecté tous les articles en une seule fois, mais progressivement. Comme maintenant, il y a des sujets actifs sur les coups de chaleur chez les chiens et sur le nombre de calories que vous devriez manger en randonnée — de vieux articles qui ont une nouvelle vie sur Discourse.

S’il y avait une option pour tout connecter en masse, je le ferais — sans comprendre un tel potentiel manqué. Je pourrais même dire que l’option de masse devrait être enterrée à six pieds sous terre, même si vous pouviez la coder :wink:

2 « J'aime »

J’essaie juste de faire passer tous les commentaires dans Discourse avant de migrer le site Web de WordPress vers Ghost, car Ghost ne gère pas les commentaires (bien que vous puissiez le connecter à Discourse pour les commentaires).

Mais il vient de me venir à l’esprit que si je connecte d’abord mon nouveau Ghost à mon Discourse avant d’importer tous mes articles WordPress, cela pourrait fonctionner… peut-être (/moi s’en va essayer…)

Il ne migre pas les commentaires de WP vers Discourse. Il affiche simplement les publications Discourse dans WordPress.

Si j’ai bien compris…

1 « J'aime »

Il est inutile de lier les articles Wordpress et les sujets Discourse si vous êtes sur le point de migrer vers Ghost.

Bonjour à tous !

Je viens de terminer la configuration de ma communauté avec Discourse ! Je teste actuellement le plugin WP Discourse sur mon site de staging.

J’ai une préoccupation concernant d’éventuels problèmes de SEO. Plus précisément, en publiant le même contenu de WP vers Discourse, je crains une duplication de contenu du point de vue du SEO. Est-ce que Discourse marque le contenu du forum comme une copie à des fins de SEO ?

Bonjour Victor :slight_smile:

Vous devriez être tranquille du point de vue du référencement avec les paramètres par défaut (car il s’agit de domaines différents), mais vous pouvez également définir l’URL canonique du sujet Discourse comme étant l’URL de l’article Wordpress.

Activez le paramètre du site Discourse embed set canonical url, puis le permalien de l’article WP sera l’URL canonique du sujet discourse (c’est-à-dire qu’il apparaîtra dans la head du HTML du sujet Discourse comme lien canonique).

Pour plus de contexte à ce sujet, voir

1 « J'aime »

Merci @angus. J’apprécie vraiment cela. Pour moi, il est plus sûr de prendre le contrôle avec le référencement, plutôt que de le laisser au hasard !

1 « J'aime »

J’essaie de définir différentes catégories pour différents custom_post_types. Le code ci-dessous sélectionne la bonne catégorie dans l’administration Wordpress. Cependant, lors de la publication sur Discourse, la catégorie n’y est pas définie (et prend par défaut la catégorie non classée)…

Peut-être que je rate quelque chose d’évident ?

// WP Discourse définir les catégories de forum CPT pour les 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;
}

Vous avez fait une supposition raisonnable sur la façon d’atteindre votre objectif, mais wp_discourse_publish_categories ne fonctionnera pas de manière fiable si vous filtrez sur une seule catégorie avec l’éditeur Gutenberg.

Vous devriez plutôt utiliser wpdc_publish_post_category :

Je mettrai à jour le message d’origine pour en tenir compte.

1 « J'aime »