Incorpora gli ultimi teaser dei post nel tuo sito web

Avevamo bisogno di caricare dinamicamente contenuti dal nostro forum Discourse su labs.daemon.com.au nel sito web pubblico della nostra azienda su www.daemon.com.au/labs

Il codice recupera i contenuti più recenti nelle categorie selezionate da Discourse, li avvolge nel markup compatibile con il nostro sito web e poi li inietta nella pagina. Successivamente, apportiamo alcune modifiche aggiuntive per rendere il codice più generico, in modo che possa essere facilmente riutilizzato su diversi siti web per caricare contenuti da forum Discourse differenti.

Un forum Discourse dispone di numerosi endpoint di dati. Ad esempio, quando si accede a Latest, viene caricato l’endpoint latest.json che restituisce i dati necessari per quella specifica pagina. Questo ci consente di visualizzare i contenuti di Discourse sul nostro sito web.

Prima di iniziare

Per caricare contenuti da Discourse in remoto, dobbiamo rendere gli endpoint di Discourse accessibili al nostro sito web. Questo può essere fatto nelle impostazioni “Admin” di Discourse.

Accedi a Discourse utilizzando un account con privilegi di amministratore, quindi vai alla scheda “Settings” nel pannello “Admin”:

Trova “Security” nella navigazione a sinistra, quindi individua il campo “cors origins” sul lato destro. Aggiungi l’URL del sito web che visualizzerà i contenuti da Discourse nel campo (nel nostro caso: http://www.daemon.com.au/), quindi salva le modifiche:

Endpoint

Poiché Discourse genera innumerevoli endpoint di dati, è importante individuare quello corretto in base ai contenuti che devono essere visualizzati in remoto. Aggiungere /l/latest.json alla fine dell’URL di una pagina di categoria mostrerà l’endpoint contenente gli ultimi post per quella specifica categoria. Ad esempio, https://labs.daemon.com.au/c/design/l/latest.json è l’endpoint per https://labs.daemon.com.au/c/design.

HTML & JavaScript

Ora che abbiamo l’endpoint necessario, passiamo a configurare il nostro sito in modo che possa leggere tale endpoint, recuperare informazioni utili e visualizzarle correttamente. In questo esempio, l’obiettivo è visualizzare gli ultimi 3 post pubblicati dall’Utente #1, #2 o #3 nella categoria “Design” all’interno del #div del nostro sito. Inoltre, non vogliamo mostrare il post “About the design category”.

N.B. Nel nostro esempio, utilizziamo Bootstrap v4.0.0-beta.2 predefinito per fornire alcuni stili necessari solo a scopo dimostrativo; il suo utilizzo è completamente opzionale.

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta content="ie=edge" http-equiv="x-ua-compatible">
    <meta content="initial-scale=1.0, shrink-to-fit=no, width=device-width" name="viewport">
    <title>Discourse embed</title>

    <!-- Bootstrap CSS per stili di base nella demo -->
    <link crossorigin="anonymous" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css" integrity="sha384-PsH8R72JQ3SOdhVi3uxftmaW6Vc51MKb0q5P2rRUpPvrszuE4W1povHYgTpBfshb" rel="stylesheet">
  </head>
  <body>
    <div class="container">
      <div class="card-deck" id="div"></div>
    </div>

    <!-- jQuery -->
    <script crossorigin="anonymous" integrity="sha384-p7RDedFtQzvcp0/3247fDud39nqze/MUmahi6MOWjyr3WKWaMOyqhXuCT1sM9Q+l" src="https://code.jquery.com/jquery-3.2.1.js"></script>

    <!-- JavaScript -->
    <script>
      (function ($) {
        'use strict'

        $(function () {
          $.ajax('https://labs.daemon.com.au/c/design/l/latest.json').then(function (result) {
            // Analizza i dati per generare contenuti da Discourse:
            // * Endpoint di Discourse, ovvero `result`,
            // * Numero di post da mostrare sul tuo sito, ad esempio `3`,
            // * Array opzionale di ID utente (whitelist)
            //   se si desidera mostrare solo i post pubblicati da utenti specifici, ad esempio `[1, 2, 3]`.
            console.log(result);
            $('#div').discourse(result, 3, [1, 2, 3]);
          });

          $.fn.discourse = function (feed, numToShow, whitelist) {
            var feedLength = feed.topic_list.topics.length;

            // Assicurati che ci siano abbastanza post da mostrare.
            if (numToShow > feedLength) {
              numToShow = feedLength;
            }

            for (var i = 0; i < numToShow; i++) {
              var content = '';

              // Gli URL negli endpoint di Discourse sono tutti URL relativi (ad esempio topic.image_url),
              // abbiamo bisogno di questo affinché i link visualizzati sul tuo sito puntino alle destinazioni corrette.
              // Modifica questo valore con l'URL del tuo forum Discourse.
              var discourseURL = 'http://labs.daemon.com.au/';

              // Variabili per i dati dei post di Discourse.
              var post          = feed.topic_list.topics[i],
                  postAuthor    = post.posters[0].user_id,
                  postDate      = new Date(post.created_at),
                  postLink      = discourseURL + 't/' + post.slug + '/' + post.id,
                  postThumbnail = discourseURL + post.image_url;

              // Se è presente una whitelist, verifica se l'autore del post è un utente verificato.
              if (typeof whitelist !== 'undefined') {
                var verifiedUser = false;

                for (var n = 0; n < whitelist.length; n++) {
                  if (postAuthor === whitelist[n]) {
                    verifiedUser = true;
                    break;
                  }
                }

                // Se l'autore del post non è nella whitelist,
                // interrompi questa iterazione e passa alla successiva nel ciclo.
                if (!verifiedUser) {
                  // Aumenta il numero di post da mostrare se possibile
                  // per compensare il post eliminato.
                  if (numToShow < feedLength) {
                    numToShow++;
                  }

                  continue;
                }
              }

              // Il blocco di codice seguente è opzionale.
              // Lo scopo è ignorare il post "About the X category"
              // poiché potrebbe non essere desiderabile mostrarlo sul tuo sito.
              if (post.title.substring(0, 10) === "About the " && post.title.substring(post.title.length - 9) === ' category') {
                // Aumenta il numero di post da mostrare se possibile
                // per compensare il post eliminato.
                if (numToShow < feedLength) {
                  numToShow++;
                }

                continue;
              }

              // Se un post non ha una miniatura,
              // utilizza un'immagine segnaposto predefinita come miniatura per il tuo sito.
              // Modifica questo valore per utilizzare l'immagine segnaposto del tuo sito.
              if (post.image_url === null) {
                postThumbnail = 'http://placehold.it/320x180';
              }

              // Genera HTML per il tuo sito.
              // Questa parte del codice potrebbe dover essere modificata di conseguenza
              // per adattarsi al markup del tuo sito.
              content += '<div class="card" style="max-width: 20rem;">';
                content += '<img alt="' + post.fancy_title + '" class="card-img-top" src="' + postThumbnail + '">';
                content += '<div class="card-body">';
                  content += '<h4 class="card-title">' + post.fancy_title + '</h4>';
                  content += '<p class="card-text"><small>' + postDate.getDate() + '/' + postDate.getMonth() + '/' + postDate.getFullYear() + '</small></p>';
                  // La riga seguente fa un po' più che mostrare l'estratto così com'è,
                  // sostituisce i tag `<a>` nell'estratto con tag `<em>`
                  // in modo che non vengano visualizzati come link sul tuo sito.
                  // Questo è opzionale, ma potrebbe essere necessario in determinate circostanze.
                  content += '<p class="card-text">' + post.excerpt.replace(/<a/g, '<em').replace(/<\/a/g, '</em') + '</p>';
                  content += '<a href="' + postLink + '">Read more</a>';
                content += '</div>';
              content += '</div>';

              $(this).append(content);
            }
          };
        });
      }(jQuery));
    </script>
  </body>
</html>

L’aspetto finale

Il JavaScript è abbastanza generico da poter essere riutilizzato su diversi siti web. Tuttavia, potresti voler procedere passo dopo passo per adattarlo alle tue esigenze. In particolare la parte relativa al markup HTML, poiché è molto probabile che debba essere personalizzata per adattarsi al markup del tuo sito.

Buon lavoro!

h/t @sesemaya Embed latest topics from Discourse on your website - development - Daemon Labs

18 Mi Piace

I have to say thanks for this how-to; it was very helpful in getting started on our own implementation and I wanted to share our version back with the community for future reference. I slightly refactored your code to better fit our needs and we’re using Mustache templates to handle the markup more flexibly.

Our actual implementation is rather different, but I’ve published a pen of your original demo built with our model:

N.B.
The included API key is for a temporary TL0 user to enable access as our instance has login required while it’s under development

4 Mi Piace