Intégrer les commentaires Discourse sur un autre site Web via Javascript

Les centaines de fois où j’ai consulté cette page CSS, et je n’avais jamais remarqué le CSS pour les intégrations…

1 « J'aime »

Si quelqu’un a du mal à trouver à quoi ressemble la page d’intégration, la voici :

J’ai essayé de mettre cela en œuvre aujourd’hui, mais j’ai rencontré quelques problèmes :

  • Dans le message du forum, l’URL dérivée (de discourseEmbedUrl ?) est mise en minuscules, ce qui casse les URL sensibles à la casse dans le lien qui suit le texte « Ceci est un sujet de discussion complémentaire pour l’entrée originale à… »
  • Lors du premier chargement de la page, l’incorporation affiche « Chargement de la discussion… » et reste bloquée. Au deuxième chargement de la page, tout fonctionne.
  • Remise à zéro de la page : lorsque le cadre iFrame se charge, il a une hauteur par défaut, mais s’il n’y a pas de commentaires trouvés, la hauteur se réduit pour n’afficher qu’une seule ligne avec « Démarrer la discussion ». Cela aggrave le bug de « chargement de la discussion », car il maintient une grande hauteur verticale.
  • Il serait souhaitable que les données extraites du parent de l’incorporation privilégient une balise meta au lieu de textifier la page entière, je suppose que c’est un comportement plus général de Discourse.

La plus grande surprise a été d’apprendre qu’à chaque fois que vous visitez une URL avec une incorporation, un nouveau sujet est créé. C’est dans l’OP :

La seule solution à laquelle je puisse penser est une solution de contournement, s’appuyant sur le SSR/cache à court terme pour interroger le point d’accès d’incorporation :

donc je pense que la logique serait :

  1. vérifier $discourse/embed/info?embed_url=$link

  2. si le sujet existe, afficher l’incorporation comme d’habitude.

  3. sinon, afficher un bouton « démarrer une conversation » qui pointe vers $discourse/new-topic?subject=$link.

Cela fonctionnerait-il, ou y a-t-il un autre lien qui doit être établi ?

Un nouveau sujet est créé uniquement lorsque la page avec l’embed est visitée pour la première fois. Lors des visites ultérieures, il affiche le sujet existant associé à l’URL.

Si vous ne souhaitez pas la création automatique de sujets, vous pouvez créer les sujets via des appels API de la manière qui vous convient le mieux, puis transmettre le topicID à l’embed pour contrôler manuellement l’association.

Compris, c’est brutal pour mon cas car il y a des dizaines de milliers de pages

Comme ça ?

  1. L’API vérifie si le sujet existe
  2. Il n’existe pas, afficher le bouton
  3. Cliquer sur le bouton, l’API ajoute le sujet
  4. Succès, le conteneur du bouton se transforme en intégration

…cela pose aussi quelques problèmes, comme les clics sur les boutons sans engagement de suivi.

Y a-t-il un moyen de ne créer le sujet que lorsqu’un utilisateur a réellement commenté, quelque chose comme ça ? :

$discourse/new-topic?subject=$link.

ou le problème ici est-il que nous ne pouvons pas passer de topicID pour un couplage déterministe ?

Non, il n’est pas possible de répondre à un sujet qui n’existe pas dans Discourse.

Pour répondre à ce besoin, nous avons rendu possible la création de tous les sujets intégrés comme des sujets non répertoriés qui sont automatiquement répertoriés la première fois que quelqu’un répond.

Je pense que la création du sujet nécessitera une requête authentifiée exécutée sur le serveur. Si vous ne voulez pas vous en occuper, une autre approche consisterait à ajouter un bouton à l’interface utilisateur qui déclenche un code similaire à celui-ci (le code qui serait autrement automatiquement ajouté à la balise <head> de la page) : discourse/public/javascripts/embed.js at 581dbca97f2b55c9bbbe40dc3b58a9df7409d77f · discourse/discourse · GitHub. Il s’agit simplement de créer un élément iframe en utilisant ces données :

<div id='discourse-comments'></div>
<meta name='discourse-username' content='DISCOURSE_USERNAME'>

<script type="text/javascript">
  DiscourseEmbed = {
    discourseUrl: 'http://127.0.0.1:4200/',
    discourseEmbedUrl: 'EMBED_URL',
    // className: 'CLASS_NAME',
  };
</script>

Modification : J’ai dû essayer. Ceci n’est qu’une preuve de concept : discourse-embed-iframe-test/app/routes/triggering-embed-code.tsx at main · scossar/discourse-embed-iframe-test · GitHub. Je ne pense pas que ce soit une bonne solution pour votre problème.

La logique est entièrement côté client (la fonction loader est juste là pour la commodité). Malheureusement, il n’y a pas de bon moyen pour le client de savoir si le sujet existe sur Discourse. Il n’est donc pas possible de personnaliser l’interface utilisateur en fonction de l’existence ou non du sujet. Il existe des moyens de résoudre ce problème, mais cela nécessiterait probablement d’écrire quelque chose dans la base de données de l’application.

Discourse utilise Window: postMessage() pour passer des données de l’iframe au document parent. Par exemple, lorsqu’un lien de réponse est cliqué dans les commentaires intégrés : discourse/app/assets/javascripts/discourse/scripts/embed-application.js at 581dbca97f2b55c9bbbe40dc3b58a9df7409d77f · discourse/discourse · GitHub. Je me demande si un message pourrait être envoyé au document parent pour indiquer qu’un sujet a été créé. Cela permettrait aux sites de faire des choses comme définir des indicateurs de chargement personnalisés, ou d’afficher une interface utilisateur différente selon que le sujet est prêt à recevoir des commentaires ou non.

1 « J'aime »

Je ne pense pas que ce soit nécessaire s’il était possible d’attribuer un lien principal à un nouveau message :

$discourse/new-topic-link?link=$link

Ce qui redirigerait probablement vers le fil de discussion s’il existe déjà et utiliserait la logique existante dans l’administrateur d’intégration. Peut-être avec des modèles ?

Je suppose qu’une autre façon de résoudre ce problème est de rechercher tous les messages qui font référence au lien en question et de faire apparaître les correspondances dans le cadre d’une conversation à l’échelle du site, en les affichant directement sur la page via SSR. Cela pourrait être équivalent étant donné que les intégrations sont en lecture seule de toute façon. Le problème le plus évident serait de choisir le fil de discussion auquel envoyer l’utilisateur lorsqu’il souhaite participer.

edit : si je parviens à trouver comment rechercher des messages par contenu de lien

Je me demande si cette fonctionnalité peut être utilisée pour attaquer un forum Discourse. Plus précisément, est-il possible pour quelqu’un de falsifier la visite de pages sous plusieurs URL d’un hôte et de créer de nombreux sujets ?

Bonjour communauté Discourse !

Je suis ravi de partager un plugin que j’ai développé pour ceux qui utilisent Docusaurus v3 et souhaitent intégrer des commentaires Discourse sur leurs sites.

docusaurus-plugin-discourse-comments

Ce plugin facilite l’intégration des commentaires Discourse dans votre site Docusaurus v3. Voici quelques fonctionnalités clés :

  • Intégration transparente avec Docusaurus v3
  • Routes d’intégration configurables
  • Mode débogage pour un dépannage facile
  • Gestion automatique des URL d’intégration
  • Placement personnalisable des commentaires

Si vous utilisez Docusaurus v3 et souhaitez ajouter des commentaires Discourse à votre documentation ou à vos articles de blog, ce plugin simplifie considérablement le processus.

Vous pouvez trouver le plugin sur npm : docusaurus-plugin-discourse-comments

4 « J'aime »

Disons que j’ai un seul hôte intégrable, blog.example.com et une liste d’autorisation de chemin d’accès générique comme /.*.

J’aimerais ajouter une intégration supplémentaire en utilisant le même hôte, mais cette fois avec une liste d’autorisation différente, par exemple /new-release.* et avec une balise supplémentaire, disons releases.

De toute évidence, le sujet de la “nouvelle version” pourrait correspondre aux deux combinaisons d’hôte/chemin, mais laquelle des deux aurait la priorité ? Dans quel ordre les règles sont-elles évaluées ?

Est-il toujours vrai que nous ne pouvons pas intégrer un sujet d’un forum privé sur un hôte distinct ? Mon cas d’utilisation est que nous utilisons Kajabi pour héberger le produit et Discourse comme plateforme de commentaires. Chacun nécessite des identifiants de connexion distincts, donc je suppose que la réponse est toujours « non possible », mais c’est l’un des facteurs limitants pour nos utilisateurs et une contrainte majeure car nous avons plus de 750 modules, chacun avec un espace de discussion dédié. Si je pouvais intégrer le sujet Discourse pour chaque module Kajabi sur la même page, même sans pouvoir commenter sur la page, cela simplifierait tout et permettrait un lien facile vers le sujet pertinent dans Discourse. Alors, y a-t-il eu des progrès à ce sujet ou cela restera-t-il toujours une limitation des forums privés ?

Je vois qu’il n’est pas possible d’intégrer des commentaires d’un forum privé (sur un site utilisant un domaine distinct) :

Cependant, ce qu’un collègue utilise pour les commentaires sur un site Ghost est un forum public (sur un domaine complètement différent), publiant principalement des articles gratuits. Il a récemment publié son premier article réservé aux membres, et comme j’ai basculé son sujet associé sur Discourse vers une catégorie où il n’est pas visible par « Tout le monde » mais plutôt par un groupe particulier (associé aux membres payants sur le site Ghost), l’intégration affiche maintenant le message « Erreur d’intégration ».

Bien que l’OP ait dit que les forums privés (sur des domaines distincts) ne permettront pas l’intégration, il s’agit d’un forum public mais avec une catégorie privée. Le problème que je rencontre est-il dû au fait qu’une catégorie privée sur un forum public est fonctionnellement identique à un forum privé ? J’ai lu le commentaire suivant, qui semble appuyer cette affirmation :

Si tel est le cas, les sujets des catégories privées sur les forums publics ne peuvent pas être intégrés tels quels, existe-t-il un moyen d’y parvenir avec un ajustement de l’intégration (et/ou de la plateforme) ? Je ne suis pas pressé de « corriger » (espérons-le) ce problème car je suis plutôt d’accord avec l’idée de définir temporairement la catégorie privée comme publique (comme Discourse ne peut pas récupérer l’article Ghost privé et donc afficher par inadvertance son contenu aux non-payants sur Discourse), mais si cela est possible, je n’hésiterais pas à engager quelqu’un plus tard pour modifier l’intégration et/ou soumettre une PR pour la plateforme.

Salut, j’utilise la fonctionnalité d’intégration avec mon blog Ghost, cependant je rencontre quelques problèmes quant à l’affichage des articles de blog sur mon forum. J’ai configuré les hôtes ci-dessous :

En raison de difficultés avec la configuration du sous-domaine (j’ai mon domaine chez un fournisseur différent de celui de mon forum Discourse), j’ai décidé d’utiliser la voie des balises.

Le problème que je rencontre est que tous mes articles de blog se retrouvent dans la catégorie Blog sur mon forum Discourse. J’utilise un utilisateur administrateur pour l’auteur des publications sur Discourse, et les 3 catégories autorisent les administrateurs à créer de nouveaux sujets.

Avez-vous une idée de ce qui pourrait causer cela ?

Peut-être spécifier les chemins pour chacun ? Par exemple, si les articles censés aller dans la catégorie blog sont sous le /blog/ , je crois que vous pouvez faire /blog/*.

1 « J'aime »

Cela ne fonctionne pas avec le blog Ghost (du moins pas avec une installation assez standard). J’utilise mon domaine principal (alphagamer.net), le blog Ghost ajoute automatiquement le chemin en fonction du titre de l’article après le domaine. J’ai essayé d’ajouter un chemin mais il le supprime simplement.

1 « J'aime »

Je me demandais si les commentaires de Discourse (sujet) pouvaient être intégrés dans un sujet Discourse ? Peut-être avec un Iframe qui inclut le bouton de réponse mais pas le reste du site. C’est-à-dire sans en-tête ni pied de page.

Je l’ai utilisé avec Ghost sans problème, à l’exception du manque d’intégration SSO, ce qui contrarie les utilisateurs.

Je me souviens avoir eu besoin de modifier un peu le code d’exemple.

Je pense que cela fonctionne bien si vous avez 1 intégration. Je pense que si vous essayez d’intégrer différents types d’articles de blog dans différentes catégories Discourse, cela nécessitera un peu plus de réglages.

Je pensais pouvoir y parvenir en utilisant les Tags, mais les Tags seuls ne semblent pas suffire (pour ma configuration). Je pense que sur Ghost, je devrai créer des Collections de contenu qui me permettent essentiellement d’ajouter une structure de dossiers (comme alphagamer.net/blog/ et les autres dont j’ai besoin). J’essaierai cela ce week-end, mettrai à jour ma « liste d’autorisation de chemins » et posterai ici si j’arrive à faire fonctionner cela.

La liste d’autorisation peut-elle être séparée par des virgules comme ceci ?

/blog/.*,/articles/.*

Edit : il semble que cela ne fonctionne pas. Ceci non plus :

/(blog|articles)/.* 

Peut-être qu’ils doivent être deux hôtes distincts ?