Incrusta una lista de temas de Discourse en un sitio externo

:bookmark: Esta guía explica cómo incrustar y mostrar una lista de temas de Discourse en sitios web externos utilizando JavaScript, lo que le permite mostrar contenido del foro como discusiones o anuncios en blogs, sitios web o plataformas de contenido externas.

:person_raising_hand: Nivel de usuario requerido: Administrador

Resumen

Incrustar temas de Discourse en sitios web externos le permite mostrar listas de temas de su foro de Discourse directamente en otros sitios. Esta integración ayuda a dirigir tráfico a su foro y mantiene a su audiencia comprometida con el contenido de su comunidad. Los temas incrustados aparecen como un widget de JavaScript que se integra con la estructura DOM de su sitio, lo que facilita su personalización a través de CSS.

Habilitar la incrustación de temas

Para configurar la incrustación de temas en su sitio externo:

  1. Navegue a su panel de administración de Discourse y haga clic en site_settings. Busque y habilite la configuración del sitio embed_topics_list.

  2. Agregue el script de incrustación a la sección <head> de HTML de su sitio externo:

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

    Reemplace discourse.example.com con la URL real de su foro de Discourse.

  3. Coloque el elemento de lista de temas donde desee mostrar los temas (por ejemplo, en una publicación de blog o en una página de sitio individual):

    <d-topics-list discourse-url="https://discourse.example.com" category="1234" per-page="5"></d-topics-list>
    
  4. Si está incrustando temas en un dominio diferente al de su sitio de Discourse, agregue el dominio de su sitio externo a Admin > Avanzado > Incrustación > Hosts.

    Por ejemplo, si su sitio de Discourse se encuentra en yourdiscourseforum.com y desea incrustar temas en yourexternalsite.com, debe agregar yourexternalsite.com a su lista de Hosts permitidos.

:warning: No puede incrustar temas de un sitio de Discourse privado que requiera inicio de sesión.

Parámetros de configuración

El elemento d-topics-list admite los siguientes atributos para personalizar la visualización de sus temas:

  • discourse-url - La URL de su sitio de Discourse (requerido)
  • template - Opciones de estilo de visualización:
    • basic (predeterminado) - Muestra información mínima del tema
    • complete - Muestra título, nombre de usuario, avatar, fecha de creación y miniatura
  • per-page - Número de temas a mostrar
  • category - ID de categoría para filtrar temas de una categoría específica
  • tags - Filtrar temas por etiquetas específicas
  • allow-create - Cuando se establece en true, muestra un botón “Nuevo tema”
  • top_period - Mostrar los temas principales de un período de tiempo específico:
    • all
    • yearly
    • quarterly
    • monthly
    • weekly
    • daily

Puede combinar varios parámetros para refinar la visualización de su lista de temas. Por ejemplo:

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

Personalización de la apariencia

Puede estilizar los temas incrustados utilizando SCSS personalizado en su panel de Admin > Personalizar > Temas. Haga clic en su tema actual o predeterminado y haga clic en Editar Código. Luego puede seleccionar Show_advanced y elegir CSS incrustado para agregar su código personalizado:

Aquí hay un ejemplo de SCSS para crear un diseño de cuadrícula:

.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%;
      }
    }
  }
}

Mejores prácticas

  • Utilice filtros de categorías y etiquetas significativos para mostrar contenido relevante para su audiencia.
  • Establezca un valor apropiado de per-page para evitar abrumar a los visitantes.
  • Pruebe sus temas incrustados en diferentes tamaños de pantalla para garantizar un diseño receptivo.
  • Considere usar la plantilla complete para una mejor apariencia visual cuando el espacio lo permita.
  • Revise regularmente su lista de Hosts permitidos para asegurarse de que solo los dominios autorizados puedan incrustar sus temas.

Problemas y soluciones comunes

Los temas no se muestran en el dominio externo

Problema: Los temas incrustados aparecen como un cuadro en blanco o gris cuando se ven en un dominio externo.

Solución: Agregue el dominio externo a los Admin > Personalizar > Incrustación > Hosts permitidos de su sitio de Discourse. Asegúrese de incluir el subdominio correcto (por ejemplo, si su sitio usa www.example.com, agregue www.example.com en lugar de solo example.com).

Errores de carga de scripts

Problema: El script de incrustación no se carga o devuelve errores de conexión.

Solución:

  • Verifique que la URL de Discourse en la fuente de su script sea correcta y accesible.
  • Verifique que la configuración del sitio embed_topics_list esté habilitada.
  • Asegúrese de que su sitio de Discourse no requiera inicio de sesión para temas públicos.

Comportamiento del contexto SameSite

En contextos SameSite donde el sitio de incrustación y el foro comparten un dominio principal, Discourse respeta el estado de inicio de sesión y muestra los resultados en consecuencia. Los usuarios conectados pueden ver contenido de categorías seguras a las que los usuarios anónimos no pueden acceder.

Preguntas frecuentes

P: ¿Puedo incrustar temas de un sitio privado de Discourse?
R: No, la incrustación de temas solo funciona con sitios públicos de Discourse. Los sitios privados que requieren inicio de sesión no se pueden incrustar.

P: ¿Puedo incrustar varias listas de temas en la misma página?
R: Sí, puede incluir varios elementos <d-topics-list> en la misma página con diferentes parámetros para mostrar varias colecciones de temas.

P: ¿Cómo incrusto temas con imágenes destacadas?
R: Utilice el parámetro template="complete" en su elemento <d-topics-list> para mostrar temas con miniaturas e imágenes destacadas.

P: ¿Puedo cambiar dónde se abren los enlaces de temas?
R: Por defecto, los enlaces de temas se abren en la ventana principal. Puede modificar este comportamiento a través de la personalización de CSS o JavaScript.

Recursos adicionales

9 Me gusta

¿Funciona esto con las suscripciones de Discourse? Intenté implementarlo y estaba enmarcando todo mi foro en lugar de los temas.

1 me gusta

Sí, esto debería funcionar junto con el plugin Discourse Subscriptions sin ningún problema.

La incrustación se basa en la configuración de parámetros específicos para controlar qué temas se muestran, como category, tags o per-page, a través de la etiqueta d-topics-list en el HTML de tu sitio web. Si tu incrustación terminó enmarcando todo tu foro, es posible que desees asegurarte de que la URL de Discourse y cualquier parámetro en la etiqueta <d-topics-list> estén configurados correctamente para reflejar los temas que pretendes mostrar.

4 Me gusta

¡Hola, está muy bien! ¡Gracias!

Quiero cambiar el valor del objetivo del elemento a de topic-list-item a “_blank” (el valor predeterminado es “_parent”, tiene un problema de dominio cruzado y no es lo que quiero), ¿qué debo hacer?

Hola, estoy intentando que esto se muestre en 2 sitios diferentes.

Mi URL de Discourse es https://learn.getupearlier.com

Tengo este script incrustado aquí y está funcionando:

Tengo el mismo script incrustado aquí y no funciona:

Esto está en la cabecera:

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

Esto está en la página:

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

¡Cualquier ayuda es apreciada!

2 Me gusta

Hola Michael,

El problema que estás encontrando aquí probablemente está relacionado con el uso de un dominio diferente al de tu dominio de Discourse para incrustar los temas.

Tu script está funcionando en getupearlier.com porque está en el mismo dominio que tu sitio de Discourse learn.getupearlier.com, mientras que michaelbakerdigital.com está en un dominio diferente.

He añadido esta sección a la guía, que explica cómo resolver esta situación.

Por lo tanto, para tu situación, añadir michaelbakerdigital.com a “Incrustaciones” → “Hosts permitidos” de tu sitio de Discourse debería permitirte incrustar correctamente temas en ese dominio.

6 Me gusta

Hola, he permitido esta URL como puedes ver a continuación:

Aquí está la URL de prueba:
https://www.michaelbakerdigital.com/discourse-test/

Solo obtengo un cuadro de error gris en blanco.

Y este es el código dentro de 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>

O esto:

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

Cualquier ayuda es apreciada, he estado atascado aquí para siempre y siempre he querido resolver esto.

Hola, la solución aquí fue que mi nombre de dominio, que se agregó a la sección de incrustación, necesitaba www.

¡Eso es todo! Tanto tiempo para 4 caracteres, pero lo resolví con la ayuda del soporte de Discourse y WP Engine.

¿Hay algún código de ejemplo para usar para mostrar también una imagen destacada en el sitio externo?

Muchas gracias

Se necesita ayuda: Incrustar lista de temas de Discourse en un sitio Next.js

Hola a todos,

Estoy intentando incrustar una lista de temas de Discourse en mi sitio web (example.io) que está construido con el framework Next.js y Node.js, desplegado a través de Vercel. He creado una réplica de prueba del sitio web en test-discourse.app para este propósito.

Esto es lo que he hecho hasta ahora:

  1. Añadí el host a la configuración de incrustación de Discourse.
  2. Habilité CORS en el entorno y añadí el host al origen de CORS.
  3. Desactivé CSP (Content Security Policy).

A pesar de seguir estos pasos y añadir los scripts necesarios, todavía no puedo ver la lista de temas en mi sitio web.

Este es el código que estoy usando:

En la sección head:

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

En la sección body:

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

También probé la incrustación de categorías como se muestra en la publicación.

¿Alguien podría señalar qué me podría estar faltando o qué estoy haciendo mal? Cualquier sugerencia para que la lista de temas aparezca en mi sitio web sería muy apreciada.

¡Gracias de antemano por su ayuda!

Tengo una instancia de Discourse ejecutándose en un VPS
Tengo otro sitio web ejecutándose en un VPS diferente
Ambos tienen el mismo dominio raíz, por ejemplo

community.mydomain.com
mydomain.com

He utilizado con éxito este método para incrustar una lista de temas del servidor del foro (Discourse) en el otro sitio web. Es realmente genial para generar tráfico de mi sitio web al foro.

Utilizo el componente de bloques de la barra lateral derecha para listar los ‘próximos eventos’ de un calendario utilizando el plugin discourse-calendar

Me gustaría replicar los ‘próximos eventos’ en mi otro sitio web. Puedo usar el método descrito en este tema para obtener todos los temas de mi categoría de calendario, pero están ordenados por los más recientemente publicados.

El componente de bloques de la barra lateral derecha los ordena por la fecha del evento
ejemplo

¿Hay alguna manera de hacer esto? Tengo control administrativo sobre ambos sitios web.
¿Hay otra forma de extraer datos de mi servidor Discourse, como la API? ¿La API está instalada en todas las instancias de Discourse por defecto o tengo que instalarla?

1 me gusta

Dado que no recibí ninguna pista, decidí responder algunas de mis propias preguntas para cualquiera que mire

solo como referencia SÍ, la instalación oficial autoalojada incluye la API REST

Obtuve pistas del hilo de ejemplo de la API sobre cómo hacer llamadas cURL desde la terminal. Una vez que los comandos cURL funcionaron, usé este sitio web para convertir la versión de línea de comandos a PHP

Mi otro servidor ejecuta PHP como backend y hago llamadas ajax desde la página web a funciones en el servidor. Discourse genera json y javascript que construyó para decodificar eso. Estiliza según sea necesario… sopa
tenga en cuenta que esto puede funcionar solo porque

y uso clave API y usuario por cómo encontrarlo aquí
espero que ayude a alguien :+1:

1 me gusta

Parece que también podemos usar el enlace de incrustación dentro de una publicación de foro, así:\n\n<iframe> width="500" height="400" src="https://meta.discourse.org/embed/topics?tags=release-notes" frameborder=0 scrolling="no"></iframe>\n\n(no funcionará aquí porque no han habilitado su propio sitio dentro de la configuración de administración de iframes)\n\nSin embargo, scrolling="no" no funciona… Aparentemente, el organismo de estándares desaprobó scrolling en HTML5 y lo reemplazó con… nada. Los iframes mejoran cada año, ¿verdad?\n\nEn mis pruebas, si cambio <body> dentro del iframe a overflow: hidden, la barra de desplazamiento horizontal desaparece. No he encontrado una manera de hacer que la vertical desaparezca. Desde mi plugin, ¿hay alguna forma de modificar la página de incrustación para establecer overflow: hidden?

Al incrustar una lista de temas, ¿cuál sería la “mejor” manera si quiero crear un carrusel a partir de todos los temas incrustados con desplazamiento horizontal?

¿Hay alguna forma de que cada enlace de tema se abra en una nueva pestaña/ventana?