Eine Liste von Discourse-Themen auf einer externen Seite einbetten

:bookmark: Diese Anleitung erklärt, wie Sie mithilfe von JavaScript eine Liste von Discourse-Themen auf externen Websites einbetten und anzeigen können. So können Sie Foreninhalte wie Diskussionen oder Ankündigungen auf Blogs, Websites oder externen Content-Plattformen präsentieren.

:person_raising_hand: Erforderliche Benutzerstufe: Administrator

Zusammenfassung

Durch das Einbetten von Discourse-Themen auf externen Websites können Sie Themenlisten aus Ihrem Discourse-Forum direkt auf anderen Seiten anzeigen. Diese Integration hilft dabei, Traffic auf Ihr Forum zu lenken und Ihr Publikum mit Community-Inhalten zu binden. Die eingebetteten Themen erscheinen als JavaScript-Widget, das in die DOM-Struktur Ihrer Website integriert wird, was eine einfachere Anpassung über CSS ermöglicht.

Themen-Einbettung aktivieren

So richten Sie die Themen-Einbettung auf Ihrer externen Website ein:

  1. Navigieren Sie zu Admin > Erweitert > Einbettung und wechseln Sie zum Reiter Einstellungen. Aktivieren Sie die Site-Einstellung embed_topics_list.

  1. Fügen Sie das Einbettungsskript im <head>-Bereich Ihrer externen Website hinzu:
<script src="https://discourse.example.com/javascripts/embed-topics.js"></script>

Ersetzen Sie discourse.example.com durch die tatsächliche URL Ihres Discourse-Foren.

  1. Platzieren Sie das Element für die Themenliste dort, wo Sie Themen anzeigen möchten (z. B. in einem Blogbeitrag oder auf einer einzelnen Website-Seite):
<d-topics-list discourse-url="https://discourse.example.com" category="1234" per-page="5"></d-topics-list>
  1. Wenn Sie Themen auf einer anderen Domain als Ihrer Discourse-Website einbetten, fügen Sie die Domain Ihrer externen Website unter Admin > Erweitert > Einbettung > Hosts hinzu.

Wenn sich Ihre Discourse-Website beispielsweise unter yourdiscourseforum.com befindet und Sie Themen auf yourexternalsite.com einbetten möchten, müssen Sie yourexternalsite.com zur Liste der erlaubten Hosts hinzufügen.

:warning: Sie können keine Themen von einem privaten, loginpflichtigen Discourse-Forum einbetten.

Konfigurationsparameter

Das Element d-topics-list unterstützt folgende Attribute zur Anpassung der Themenanzeige:

  • discourse-url – Die URL Ihrer Discourse-Website (erforderlich)
  • template – Optionen für den Anzeigestil:
    • basic (Standard) – Zeigt die Thementitel als Links an
    • complete – Zeigt Titel, Benutzername, Avatar, Erstellungsdatum, Zeit der letzten Antwort, Anzahl der Likes, Anzahl der Antworten sowie das hervorgehobene Bild/Thumbnail an
  • per-page – Anzahl der anzuzeigenden Themen (begrenzt durch die versteckte Site-Einstellung embed_topic_limit_per_page, Standardwert 200)
  • category – Kategorie-ID, um Themen aus einer bestimmten Kategorie zu filtern
  • tags – Filtern von Themen nach bestimmten Tags
  • allow-create – Wenn auf true gesetzt, wird eine Schaltfläche „Neues Thema“ angezeigt
  • embed-class – Fügt dem Container der eingebetteten Themenliste eine benutzerdefinierte CSS-Klasse hinzu (nur alphanumerische Zeichen, Bindestriche und Unterstriche erlaubt)
  • top-period – Zeigt Top-Themen aus einem bestimmten Zeitraum an:
    • all
    • yearly
    • quarterly
    • monthly
    • weekly
    • daily

Sie können mehrere Parameter kombinieren, um Ihre Themenliste weiter zu verfeinern. Beispiel:

<d-topics-list 
  discourse-url="https://discourse.example.com" 
  category="5" 
  tags="announcements" 
  per-page="10"
  template="complete">
</d-topics-list>

Anpassung des Erscheinungsbilds

Sie können die eingebetteten Themen mithilfe von benutzerdefiniertem SCSS im Bereich Admin > Erscheinungsbild > Themes und Komponenten gestalten. Klicken Sie auf Ihr aktuelles oder Standard-Theme und dann auf Code bearbeiten. Wählen Sie anschließend Show_advanced und dann Embedded CSS, um Ihren benutzerdefinierten Code hinzuzufügen:

Hier ist ein Beispiel-SCSS für ein Raster-Layout:

.topics-list {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  
  .topic-list-item {
    .main-link {
      border: 1px dotted gray;
      padding: 0;
    }
    
    .topic-column-wrapper {
      flex-direction: column-reverse;
      
      .topic-column.details-column {
        width: 100%;
      }
      
      .topic-column.featured-image-column .topic-featured-image img {
        max-width: initial;
        max-height: initial;
        width: 100%;
      }
    }
  }
}

Best Practices

  • Verwenden Sie aussagekräftige Kategorien- und Tag-Filter, um relevante Inhalte für Ihr Publikum anzuzeigen.
  • Legen Sie einen angemessenen Wert für per-page fest, um Besucher nicht zu überfordern.
  • Testen Sie Ihre eingebetteten Themen auf verschiedenen Bildschirmgrößen, um ein responsives Design sicherzustellen.
  • Erwägen Sie die Verwendung der complete-Vorlage für eine ansprechendere Darstellung, wenn Platz vorhanden ist.
  • Überprüfen Sie regelmäßig Ihre Liste der erlaubten Hosts, um sicherzustellen, dass nur autorisierte Domains Ihre Themen einbetten können.

Häufige Probleme und Lösungen

Themen werden auf externer Domain nicht angezeigt

Problem: Die eingebetteten Themen erscheinen als leerer oder grauer Kasten, wenn sie auf einer externen Domain betrachtet werden.

Lösung: Fügen Sie die externe Domain unter Admin > Erweitert > Einbettung > Hosts zu Ihrer Discourse-Website hinzu. Stellen Sie sicher, dass Sie das korrekte Subdomain einfügen (z. B. wenn Ihre Website www.example.com verwendet, fügen Sie www.example.com hinzu, nicht nur example.com).

Skript-Ladefehler

Problem: Das Einbettungsskript lädt nicht oder es treten Verbindungsfehler auf.

Lösung:

  • Überprüfen Sie, ob die Discourse-URL in Ihrer Skript-Quellangabe korrekt und erreichbar ist.
  • Stellen Sie sicher, dass die Site-Einstellung embed_topics_list aktiviert ist.
  • Vergewissern Sie sich, dass Ihre Discourse-Website für öffentliche Themen nicht loginpflichtig ist.

Verhalten im SameSite-Kontext

In SameSite-Kontexten, in denen die einbettende Website und das Forum eine gemeinsame übergeordnete Domain teilen, berücksichtigt Discourse den Login-Status und zeigt die Ergebnisse entsprechend an. Eingeloggte Benutzer können möglicherweise Inhalte aus sicheren Kategorien sehen, die für anonyme Benutzer nicht zugänglich sind.

FAQs

F: Kann ich Themen von einem privaten Discourse-Forum einbetten?
A: Nein, die Themen-Einbettung funktioniert nur mit öffentlichen Discourse-Websites. Private, loginpflichtige Websites können nicht eingebettet werden.

F: Kann ich mehrere Themenlisten auf derselben Seite einbetten?
A: Ja, Sie können mehrere <d-topics-list>-Elemente mit unterschiedlichen Parametern auf derselben Seite einfügen, um verschiedene Themenkollektionen anzuzeigen.

F: Wie bette ich Themen mit hervorgehobenen Bildern ein?
A: Verwenden Sie den Parameter template="complete" in Ihrem <d-topics-list>-Element, um Themen mit Thumbnails und hervorgehobenen Bildern anzuzeigen.

F: Kann ich ändern, wo Themen-Links geöffnet werden?
A: Standardmäßig öffnen sich Themen-Links im übergeordneten Fenster. Dieses Verhalten kann durch CSS- oder JavaScript-Anpassungen geändert werden.

Zusätzliche Ressourcen

9 „Gefällt mir“

Funktioniert dies mit Discourse-Abonnements? Ich habe versucht, es zu implementieren, und es hat meinen gesamten Forum anstatt von Themen eingerahmt?

1 „Gefällt mir“

Ja, dies sollte problemlos zusammen mit dem Discourse Subscriptions Plugin funktionieren.

Das Embedding basiert auf der Konfiguration spezifischer Parameter zur Steuerung der angezeigten Themen, wie z. B. category, tags oder per-page, über das d-topics-list-Tag in der HTML-Datei Ihrer Website. Wenn Ihr Embedding Ihr gesamtes Forum eingerahmt hat, sollten Sie sicherstellen, dass die Discourse-URL und alle Parameter im d-topics-list-Tag korrekt eingestellt sind, um die von Ihnen beabsichtigten Themen widerzuspiegeln.

4 „Gefällt mir“

Hallo, das ist sehr nett! Danke!

Ich möchte den Zielwert des topic-list-item a-Elements auf “_blank” ändern (Standard ist “_parent”, hat ein Problem mit domänenübergreifenden Problemen und ist nicht das, was ich will).

Was soll ich tun?

Hallo, ich versuche, diese auf 2 verschiedenen Websites anzuzeigen.

Meine Discourse-URL ist https://learn.getupearlier.com

Ich habe dieses Skript hier eingebettet und es funktioniert:

Ich habe das gleiche Skript hier eingebettet und es funktioniert nicht:

Dies befindet sich im Header:

<script src="https://learn.getupearlier.com/javascripts/embed-topics.js"></script>

Dies befindet sich auf der Seite:

<d-topics-list discourse-url="https://learn.getupearlier.com" category="5" per-page="10"></d-topics-list>

Jede Hilfe wird geschätzt!

2 „Gefällt mir“

Hallo Michael,

Das Problem, auf das Sie hier stoßen, hängt wahrscheinlich damit zusammen, dass Sie eine andere Domain als Ihre Discourse-Domain verwenden, um die Themen einzubetten.

Ihr Skript funktioniert auf getupearlier.com, da dies auf derselben Domain wie Ihre Discourse-Site learn.getupearlier.com liegt, während michaelbakerdigital.com auf einer anderen Domain liegt.

Ich habe diesen Abschnitt zum Leitfaden hinzugefügt, der erklärt, wie Sie diese Situation lösen können.

Für Ihre Situation sollte das Hinzufügen von michaelbakerdigital.com zu den „Einbettungen“ → „Zulässige Hosts“ Ihrer Discourse-Site es Ihnen ermöglichen, Themen auf dieser Domain korrekt einzubetten.

6 „Gefällt mir“

Hallo, ich habe diese URL wie unten gezeigt erlaubt:

Hier ist die Test-URL:
https://www.michaelbakerdigital.com/discourse-test/

Ich erhalte nur ein leeres graues Fehlerfeld.

Und hier ist der Code auf michaelbakerdigital.com:

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

<script type="text/javascript">
  DiscourseEmbed = {
    discourseUrl: 'https://learn.getupearlier.com/',
    discourseEmbedUrl: 'michaelbakerdigital.com',
    // className: 'CLASS_NAME',
  };

  (function() {
    var d = document.createElement('script'); d.type = 'text/javascript'; d.async = true;
    d.src = DiscourseEmbed.discourseUrl + 'javascripts/embed.js';
    (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(d);
  })();
</script>

Oder das:

<d-topics-list discourse-url="https://learn.getupearlier.com" category="5" per-page="5"></d-topics-list>

Jede Hilfe wird geschätzt. Ich stecke hier schon ewig fest und wollte das schon immer lösen.

Hallo, die Lösung hier war, dass mein Domainname, der in den Einbettungsbereich eingefügt wurde, www. benötigte.

Das ist alles! So viel Zeit für 4 Zeichen, aber mit Hilfe von Discourse und dem WP Engine-Support gelöst.

Gibt es ein Beispielcode, um auch ein Beitragsbild auf der externen Website auszugeben?

Vielen Dank

Hilfe benötigt: Einbetten der Discourse-Themenliste auf einer Next.js-Website

Hallo zusammen,

ich versuche, eine Discourse-Themenliste auf meiner Website (example.io) einzubetten, die mit dem Next.js-Framework und Node.js erstellt und über Vercel bereitgestellt wird. Zu diesem Zweck habe ich eine Testkopie der Website unter test-discourse.app erstellt.

Hier ist, was ich bisher getan habe:

  1. Den Host in den Discourse-Einbetten-Einstellungen hinzugefügt.
  2. CORS in der Umgebung aktiviert und den Host zu den CORS-Ursprüngen hinzugefügt.
  3. CSP (Content Security Policy) deaktiviert.

Trotz dieser Schritte und dem Hinzufügen der notwendigen Skripte kann ich die Themenliste auf meiner Website immer noch nicht sehen.

Hier ist der Code, den ich verwende:

Im Kopfbereich:

<script src="my-website/javascripts/embed-topics.js"></script>

Im Rumpfbereich:

<d-topics-list discourse-url="my-website" tags="example"></d-topics-list>

Habe auch das Einbetten von Kategorien versucht, wie im Beitrag gezeigt

Könnte mir jemand sagen, was ich möglicherweise übersehe oder falsch mache? Jeder Vorschlag, wie die Themenliste auf meiner Website erscheinen könnte, wäre sehr dankbar.

Vielen Dank im Voraus für Ihre Hilfe!

Ich habe eine Discourse-Instanz auf einem VPS laufen
Ich habe eine andere Website, die auf einem anderen VPS läuft
Beide haben dieselbe Root-Domain, zum Beispiel

community.mydomain.com
mydomain.com

Ich habe diese Methode erfolgreich verwendet, um eine Themenliste vom Forum-Server (Discourse) in die andere Website einzubetten. Es ist wirklich großartig, um Traffic von meiner Website zum Forum zu generieren.

Ich verwende die Komponente “Right Sidebar Blocks”, um “bevorstehende Veranstaltungen” aus einem Kalender mit dem Discourse-Calendar-Plugin aufzulisten.

Ich möchte die “bevorstehenden Veranstaltungen” auf meiner anderen Website replizieren. Ich kann die in diesem Thema beschriebene Methode verwenden, um alle Themen in meiner Kalenderkategorie zu erhalten, aber sie sind nach dem zuletzt geposteten Thema sortiert.

Die Komponente “Right Sidebar Blocks” sortiert sie nach dem Datum der Veranstaltung.
Beispiel

Gibt es eine Möglichkeit, dies zu tun? Ich habe die administrative Kontrolle über beide Websites.
Gibt es eine andere Möglichkeit, Daten von meinem Discourse-Server zu extrahieren, wie z. B. die API? Ist die API standardmäßig auf allen Discourse-Instanzen installiert oder muss ich sie installieren?

1 „Gefällt mir“

Da ich keine Hinweise erhalten habe, dachte ich, ich beantworte ein paar meiner eigenen Fragen für alle, die nachschauen

Nur zur Referenz JA, selbst gehostete offizielle Installation enthielt die REST-API

Ich habe Hinweise aus dem API-Beispiel-Thread erhalten, wie man cURL-Aufrufe vom Terminal aus macht. Sobald die cURL-Befehle funktionierten, habe ich diese Website verwendet, um die Kommandozeilenversion in PHP zu konvertieren

Mein anderer Server läuft mit PHP als Backend und ich mache Ajax-Aufrufe von der Webseite an Funktionen auf dem Server. Discourse gibt JSON aus und JavaScript, das es zum Dekodieren erstellt hat. Stil nach Bedarf… Suppe
Hinweis: Dies funktioniert möglicherweise nur, weil

und ich verwende API-Schlüssel und Benutzer pro wie man hier findet
Ich hoffe, es hilft jemandem :+1:

1 „Gefällt mir“

Es scheint, dass wir den Einbettungslink auch in einem Forum-Beitrag verwenden können, wie hier:\n\n<iframe> width="500" height="400" src="https://meta.discourse.org/embed/topics?tags=release-notes" frameborder=0 scrolling="no"></iframe>\n\n(es wird hier nicht funktionieren, da sie ihre eigene Website nicht in den iframe-Admin-Einstellungen aktiviert haben)\n\nAllerdings funktioniert scrolling="no" nicht… Anscheinend hat der Standardisierungsgremium scrolling in HTML5 als veraltet erklärt und durch… nichts ersetzt. Iframes werden jedes Jahr besser, oder?\n\nBei meinen Tests, wenn ich den <body> innerhalb des iframes zu overflow: hidden ändere, verschwindet die horizontale Scrollleiste. Ich habe noch keinen Weg gefunden, die vertikale zu entfernen. Gibt es von meinem Plugin aus eine Möglichkeit, die Einbettungsseite so zu ändern, dass overflow: hidden gesetzt wird?

Wenn Sie eine Liste von Themen einbetten, wie würden Sie am besten vorgehen, wenn Sie aus allen eingebetteten Themen ein Karussell mit horizontalem Scrollen erstellen möchten?

Gibt es eine Möglichkeit, jeden Themenlink so zu ändern, dass er in einem neuen Tab/Fenster geöffnet wird?