Eine Liste von Discourse-Themen auf einer externen Seite einbetten

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

:person_raising_hand: Erforderliches Benutzerniveau: Administrator

Zusammenfassung

Das Einbetten von Discourse-Themen auf externen Websites ermöglicht es Ihnen, Themenlisten von Ihrem Discourse-Forum direkt auf anderen Websites anzuzeigen. Diese Integration hilft, Traffic auf Ihr Forum zu lenken und Ihr Publikum mit Ihren Community-Inhalten zu beschäftigen. Die eingebetteten Themen erscheinen als JavaScript-Widget, das sich in die DOM-Struktur Ihrer Website integriert und so eine einfache Anpassung durch CSS ermöglicht.

Einbetten von Themen aktivieren

So richten Sie das Einbetten von Themen auf Ihrer externen Website ein:

  1. Navigieren Sie zu Ihrem Discourse-Admin-Dashboard und klicken Sie auf site_settings. Suchen Sie nach der Website-Einstellung embed_topics_list und aktivieren Sie sie.

  2. Fügen Sie das Einbettungsskript in den HTML-Head-Bereich Ihrer externen Website ein:

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

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

  3. Platzieren Sie das Themenlisten-Element 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>
    
  4. Wenn Sie Themen auf einer anderen Domain als Ihrer Discourse-Website einbetten, fügen Sie die Domain Ihrer externen Website zu Admin > Erweitert > Einbetten > 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 zu Ihrer Liste der erlaubten Hosts hinzufügen.

    :warning: Sie können keine Themen von einer privaten Discourse-Website einbetten, die eine Anmeldung erfordert.

Konfigurationsparameter

Das Element d-topics-list unterstützt die folgenden Attribute zur Anpassung Ihrer Themenanzeige:

  • discourse-url - Die URL Ihrer Discourse-Website (erforderlich)
  • template - Optionen für den Anzeigestil:
    • basic (Standard) - Zeigt minimale Themeninformationen an
    • complete - Zeigt Titel, Benutzernamen, Avatar, Erstellungsdatum und Miniaturansicht an
  • per-page - Anzahl der anzuzeigenden Themen
  • category - Kategorie-ID zum Filtern von Themen aus einer bestimmten Kategorie
  • tags - Themen nach bestimmten Tags filtern
  • allow-create - Wenn auf true gesetzt, wird eine Schaltfläche “Neues Thema” angezeigt
  • top_period - Zeigt die Top-Themen aus einem bestimmten Zeitraum an:
    • all
    • yearly
    • quarterly
    • monthly
    • weekly
    • daily

Sie können mehrere Parameter kombinieren, um Ihre Themenlistenanzeige zu verfeinern. Zum 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 mit benutzerdefiniertem SCSS in Ihrem Bereich Admin > Anpassen > Themes gestalten. Klicken Sie auf Ihr aktuelles oder Standardthema und dann auf Code bearbeiten. Sie können dann Erweitert anzeigen auswählen und Eingebettetes CSS wählen, um Ihren benutzerdefinierten Code hinzuzufügen:

Hier ist ein Beispiel für SCSS zum Erstellen eines Rasterlayouts:

.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 Kategorie- und Tag-Filter, um relevante Inhalte für Ihr Publikum anzuzeigen.
  • Legen Sie einen geeigneten Wert für per-page fest, um Besucher nicht zu überfordern.
  • Testen Sie Ihre eingebetteten Themen auf verschiedenen Bildschirmgrößen, um ein responsives Design zu gewährleisten.
  • Erwägen Sie die Verwendung der Vorlage complete für eine bessere visuelle Darstellung, wenn der Platz dies zulässt.
  • Ü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 leeres oder graues Feld, wenn sie auf einer externen Domain angezeigt werden.

Lösung: Fügen Sie die externe Domain zu Admin > Anpassen > Einbetten > Erlaubte Hosts Ihrer Discourse-Website hinzu. Stellen Sie sicher, dass Sie die richtige Subdomain angeben (z. B. wenn Ihre Website www.example.com verwendet, fügen Sie www.example.com und nicht nur example.com hinzu).

Skriptladefehler

Problem: Das Einbettungsskript kann nicht geladen werden oder gibt Verbindungsfehler zurück.

Lösung:

  • Überprüfen Sie, ob die Discourse-URL in Ihrer Skriptquelle korrekt und zugänglich ist.
  • Stellen Sie sicher, dass die Website-Einstellung embed_topics_list aktiviert ist.
  • Stellen Sie sicher, dass Ihre Discourse-Website für öffentliche Themen keine Anmeldung erfordert.

SameSite-Kontextverhalten

In SameSite-Kontexten, in denen die einbettende Website und das Forum eine übergeordnete Domain teilen, respektiert Discourse den Anmeldestatus und zeigt die Ergebnisse entsprechend an. Angemeldete Benutzer sehen möglicherweise Inhalte aus sicheren Kategorien, auf die anonyme Benutzer keinen Zugriff haben.

FAQs

F: Kann ich Themen von einer privaten Discourse-Website einbetten?
A: Nein, das Einbetten von Themen funktioniert nur mit öffentlichen Discourse-Websites. Private Websites, die eine Anmeldung erfordern, 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 Themcollections 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 Miniaturansichten und hervorgehobenen Bildern anzuzeigen.

F: Kann ich ändern, wo Themenlinks geöffnet werden?
A: Standardmäßig werden Themenlinks im übergeordneten Fenster geöffnet. Sie können dieses Verhalten durch Anpassung von CSS oder JavaScript ändern.

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?