Incorpora un elenco di argomenti Discourse su un sito esterno

:bookmark: Questa guida spiega come incorporare e visualizzare un elenco di argomenti Discourse su siti web esterni utilizzando JavaScript, consentendoti di mostrare contenuti del forum, come discussioni o annunci, su blog, siti web o piattaforme di contenuti esterne.

:person_raising_hand: Livello utente richiesto: Amministratore

Riepilogo

Incorporare gli argomenti di Discourse su siti web esterni ti permette di visualizzare elenchi di argomenti dal tuo forum Discourse direttamente su altri siti. Questa integrazione aiuta a generare traffico verso il tuo forum e mantiene il tuo pubblico coinvolto con i contenuti della tua comunità. Gli argomenti incorporati appaiono come un widget JavaScript che si integra con la struttura DOM del tuo sito, rendendo più semplice la personalizzazione tramite CSS.

Abilitare l’incorporamento degli argomenti

Per configurare l’incorporamento degli argomenti sul tuo sito esterno:

  1. Vai su Admin > Avanzate > Incorporamento e passa alla scheda Impostazioni. Abilita l’impostazione del sito embed_topics_list

  1. Aggiungi lo script di incorporamento alla sezione head HTML del tuo sito esterno:
<script src="https://discourse.example.com/javascripts/embed-topics.js"></script>

Sostituisci discourse.example.com con l’URL effettivo del tuo forum Discourse.

  1. Posiziona l’elemento dell’elenco degli argomenti dove desideri visualizzare gli argomenti (ad esempio in un post del blog o su una pagina individuale del sito):
<d-topics-list discourse-url="https://discourse.example.com" category="1234" per-page="5"></d-topics-list>
  1. Se stai incorporando argomenti su un dominio diverso dal tuo sito Discourse, aggiungi il dominio del tuo sito esterno a Admin > Avanzate > Incorporamento > Host

Ad esempio, se il tuo sito Discourse si trova su yourdiscourseforum.com e desideri incorporare argomenti su yourexternalsite.com, devi aggiungere yourexternalsite.com alla tua lista di Host consentiti.

:warning: Non è possibile incorporare argomenti da un sito Discourse privato che richiede l’accesso.

Parametri di configurazione

L’elemento d-topics-list supporta i seguenti attributi per personalizzare la visualizzazione degli argomenti:

  • discourse-url - L’URL del tuo sito Discourse (obbligatorio)
  • template - Opzioni di stile di visualizzazione:
    • basic (predefinito) - Mostra i titoli degli argomenti come collegamenti
    • complete - Mostra titolo, nome utente, avatar, data di creazione, ora dell’ultima risposta, numero di like, numero di risposte e immagine in evidenza/miniatura
  • per-page - Numero di argomenti da visualizzare (limitato dall’impostazione del sito nascosta embed_topic_limit_per_page, predefinito 200)
  • category - ID categoria per filtrare gli argomenti da una categoria specifica
  • tags - Filtra gli argomenti per tag specifici
  • allow-create - Se impostato su true, mostra un pulsante “Nuovo argomento”
  • embed-class - Aggiunge una classe CSS personalizzata al contenitore dell’elenco degli argomenti incorporati (solo caratteri alfanumerici, trattini e trattini bassi)
  • top-period - Mostra gli argomenti principali di un periodo di tempo specifico:
    • all
    • yearly
    • quarterly
    • monthly
    • weekly
    • daily

Puoi combinare più parametri per affinare la visualizzazione del tuo elenco di argomenti. Ad esempio:

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

Personalizzazione dell’aspetto

Puoi stilizzare gli argomenti incorporati utilizzando SCSS personalizzato nel pannello Admin > Aspetto > Temi e componenti. Clicca sul tuo tema corrente o predefinito e clicca su Modifica codice. Puoi quindi selezionare Show_advanced e scegliere CSS incorporato per aggiungere il tuo codice personalizzato:

Ecco un esempio di SCSS per creare un layout a griglia:

.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 practice

  • Utilizza filtri di categoria e tag significativi per mostrare contenuti pertinenti per il tuo pubblico
  • Imposta un valore appropriato per per-page per evitare di sovraccaricare i visitatori
  • Testa i tuoi argomenti incorporati su diverse dimensioni dello schermo per garantire un design responsivo
  • Considera l’uso del template complete per un migliore impatto visivo quando lo spazio lo consente
  • Rivedi regolarmente la tua lista di Host consentiti per assicurarti che solo domini autorizzati possano incorporare i tuoi argomenti

Problemi comuni e soluzioni

Argomenti non visualizzati su dominio esterno

Problema: Gli argomenti incorporati appaiono come una casella vuota o grigia quando visualizzati su un dominio esterno.

Soluzione: Aggiungi il dominio esterno agli Host del tuo sito Discourse in Admin > Avanzate > Incorporamento > Host. Assicurati di includere il sottodominio corretto (ad esempio, se il tuo sito utilizza www.example.com, aggiungi www.example.com invece di solo example.com).

Errori di caricamento dello script

Problema: Lo script di incorporamento non riesce a caricarsi o restituisce errori di connessione.

Soluzione:

  • Verifica che l’URL di Discourse nella sorgente dello script sia corretto e accessibile
  • Controlla che l’impostazione del sito embed_topics_list sia abilitata
  • Assicurati che il tuo sito Discourse non richieda l’accesso per gli argomenti pubblici

Comportamento nel contesto SameSite

In contesti SameSite in cui il sito di incorporamento e il forum condividono un dominio padre, Discourse rispetta lo stato di accesso e visualizza i risultati di conseguenza. Gli utenti loggati potrebbero vedere contenuti da categorie sicure a cui gli utenti anonimi non hanno accesso.

Domande frequenti

D: Posso incorporare argomenti da un sito Discourse privato?
R: No, l’incorporamento degli argomenti funziona solo con siti Discourse pubblici. I siti privati che richiedono l’accesso non possono essere incorporati.

D: Posso incorporare più elenchi di argomenti sulla stessa pagina?
R: Sì, puoi includere più elementi <d-topics-list> sulla stessa pagina con parametri diversi per visualizzare varie raccolte di argomenti.

D: Come incorporo argomenti con immagini in evidenza?
R: Utilizza il parametro template="complete" nel tuo elemento <d-topics-list> per visualizzare argomenti con miniature e immagini in evidenza.

D: Posso modificare dove si aprono i collegamenti agli argomenti?
R: Di default, i collegamenti agli argomenti si aprono nella finestra padre. Puoi modificare questo comportamento tramite personalizzazioni CSS o JavaScript.

Risorse aggiuntive

9 Mi Piace

Funziona con gli abbonamenti Discourse? Ho provato a implementarlo e stava inquadrando l’intero forum anziché gli argomenti?

1 Mi Piace

Sì, questo dovrebbe funzionare insieme al plugin Discourse Subscriptions senza problemi.

L’incorporamento si basa sulla configurazione di parametri specifici per controllare quali argomenti vengono visualizzati, come category, tags o per-page, tramite il tag d-topics-list nell’HTML del tuo sito web. Se il tuo incorporamento ha finito per inquadrare l’intero forum, potresti voler assicurarti che l’URL di Discourse e qualsiasi parametro nel tag <d-topics-list> siano impostati correttamente per riflettere gli argomenti che intendi visualizzare.

4 Mi Piace

Ciao, è molto bello! Grazie!

Vorrei cambiare il valore target dell’elemento a di topic-list-item in “_blank” (il valore predefinito è “_parent”, ha problemi di cross-domain e non è quello che voglio), cosa devo fare?

Ciao, sto cercando di visualizzare questi su 2 siti diversi.

Il mio URL di Discourse è https://learn.getupearlier.com

Ho questo script incorporato qui e funziona:

Ho lo stesso script incorporato qui e non funziona:

Questo è nell’header:

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

Questo è nella pagina:

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

Qualsiasi aiuto è apprezzato!

2 Mi Piace

Ciao Michael,

Il problema che stai riscontrando qui è probabilmente correlato all’utilizzo di un dominio diverso da quello del tuo sito Discourse per incorporare gli argomenti.

Il tuo script funziona su getupearlier.com perché si trova sullo stesso dominio del tuo sito Discourse learn.getupearlier.com, mentre michaelbakerdigital.com si trova su un dominio diverso.

Ho aggiunto questa sezione alla guida, che spiega come risolvere questa situazione.

Quindi, per la tua situazione, l’aggiunta di michaelbakerdigital.com a “Incorporamento” → “Host consentiti” del tuo sito Discourse dovrebbe consentirti di incorporare correttamente gli argomenti su quel dominio.

6 Mi Piace

Ciao, ho permesso questo URL come puoi vedere di seguito:

Ecco l’URL di prova:
https://www.michaelbakerdigital.com/discourse-test/

Ottengo solo una casella di errore grigia vuota

E questo è il codice all’interno di 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>

Oppure questo:

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

Qualsiasi aiuto è apprezzato, sono bloccato qui da sempre e continuo a voler risolvere questo problema.

Ciao, la soluzione qui è stata che il mio nome di dominio, aggiunto alla sezione embed, necessitava di www.

Questo è tutto! Tanto tempo per 4 caratteri, ma l’ho risolto con l’aiuto del supporto di Discourse e WP Engine.

C’è un codice di esempio da utilizzare per pubblicare anche un’immagine in primo piano sul sito esterno?

Grazie mille

Aiuto Necessario: Incorporare l’elenco degli argomenti di Discourse sul sito Next.js

Ciao a tutti,

Sto cercando di incorporare un elenco di argomenti di Discourse sul mio sito web (example.io) che è costruito con il framework Next.js e Node.js, distribuito tramite Vercel. Ho creato una replica di test del sito web su test-discourse.app a questo scopo.

Ecco cosa ho fatto finora:

  1. Ho aggiunto l’host alle impostazioni di incorporamento di Discourse.
  2. Ho abilitato CORS nell’ambiente e aggiunto l’host all’origine CORS.
  3. Ho disattivato CSP (Content Security Policy).

Nonostante abbia seguito questi passaggi e aggiunto gli script necessari, non riesco ancora a vedere l’elenco degli argomenti sul mio sito web.

Ecco il codice che sto utilizzando:

Nella sezione head:

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

Nella sezione body:

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

Ho anche provato l’incorporamento delle categorie come mostrato nel post.

Qualcuno potrebbe indicarmi cosa potrei star trascurando o facendo di sbagliato? Qualsiasi suggerimento per far apparire l’elenco degli argomenti sul mio sito web sarebbe molto apprezzato.

Grazie in anticipo per il vostro aiuto!

Ho un’istanza Discourse in esecuzione su un VPS
Ho un altro sito web in esecuzione su un VPS diverso
Entrambi hanno lo stesso dominio principale, ad esempio

community.mydomain.com
mydomain.com

Ho utilizzato con successo questo metodo per incorporare un elenco di argomenti dal server del forum (Discourse) nell’altro sito web. È davvero ottimo per generare traffico dal mio sito web al forum.

Utilizzo il componente dei blocchi della barra laterale destra per elencare gli ‘eventi imminenti’ da un calendario utilizzando il plugin discourse-calendar

Vorrei replicare gli ‘eventi imminenti’ sul mio altro sito web. Posso utilizzare il metodo descritto in questo argomento per ottenere tutti gli argomenti nella mia categoria del calendario, ma sono ordinati per quelli pubblicati più di recente

Il componente dei blocchi della barra laterale destra li ordina per data dell’evento
esempio

C’è un modo per farlo? Ho il controllo amministrativo su entrambi i siti web.
Esiste un altro modo per estrarre dati dal mio server Discourse, come l’API? L’API è installata su tutte le istanze Discourse per impostazione predefinita o devo installarla?

1 Mi Piace

Dato che non ho ricevuto alcun suggerimento, ho pensato di rispondere ad alcune delle mie domande per chiunque fosse interessato

solo per riferimento SÌ, l’installazione self-hosted installazione ufficiale includeva l’API REST

Ho ricevuto suggerimenti dal thread di esempio API su come effettuare chiamate cURL dal terminale. Una volta che i comandi cURL hanno funzionato, ho utilizzato questo sito web per convertire la versione da riga di comando in PHP

Il mio altro server esegue PHP come backend e faccio chiamate ajax dalla pagina web alle funzioni sul server. Discourse restituisce json e javascript che ha creato per decodificarlo. Stile secondo necessità… zuppa
nota che questo potrebbe funzionare solo perché

e uso la chiave API e l’utente per come trovare qui
spero aiuti qualcuno :+1:

1 Mi Piace

Sembra che possiamo anche usare il link di incorporamento all’interno di un post del forum, in questo modo:

<iframe width="500" height="400" src="https://meta.discourse.org/embed/topics?tags=release-notes" frameborder=0 scrolling="no"></iframe>

(non funzionerà qui perché non hanno abilitato il proprio sito nelle impostazioni di amministrazione di iframe)

Tuttavia, scrolling="no" non funziona… Apparentemente il consorzio standard ha deprecato lo scrolling in HTML5 e lo ha sostituito con… niente. Gli iframe migliorano ogni anno, vero?

Nel mio test, se cambio il <body all’interno dell’iframe in overflow: hidden, la barra di scorrimento orizzontale scompare. Non ho trovato un modo per far scomparire quella verticale. Dal mio plugin c’è un modo per modificare la pagina di incorporamento per impostare overflow: hidden?

Quando si incorporano elenchi di argomenti, qual è il modo “migliore” se voglio creare una carosello da tutti gli argomenti incorporati con scorrimento orizzontale?

C’è un modo per cambiare ogni link dell’argomento in modo che si apra in una nuova scheda/finestra?