Incorpore uma lista de tópicos do Discourse em um site externo

:bookmark: Este guia explica como incorporar e exibir uma lista de tópicos do Discourse em sites externos usando JavaScript, permitindo que você exiba conteúdo do fórum, como discussões ou anúncios, em blogs, sites ou plataformas de conteúdo externas.

:person_raising_hand: Nível de usuário necessário: Administrador

Resumo

Incorporar tópicos do Discourse em sites externos permite exibir listas de tópicos do seu fórum Discourse diretamente em outros sites. Essa integração ajuda a direcionar tráfego para o seu fórum e mantém seu público engajado com o conteúdo da sua comunidade. Os tópicos incorporados aparecem como um widget JavaScript que se integra à estrutura DOM do seu site, facilitando a personalização via CSS.

Habilitar incorporação de tópicos

Para configurar a incorporação de tópicos no seu site externo:

  1. Navegue até o painel de administração do Discourse e clique em site_settings. Procure e habilite a configuração de site embed_topics_list.

  1. Adicione o script de incorporação à seção <head> do HTML do seu site externo:
<script src="https://discourse.example.com/javascripts/embed-topics.js"></script>

Substitua discourse.example.com pelo URL real do seu fórum Discourse.

  1. Coloque o elemento da lista de tópicos onde você deseja exibir os tópicos (como em uma postagem de blog ou em uma página de site individual):
<d-topics-list discourse-url="https://discourse.example.com" category="1234" per-page="5"></d-topics-list>
  1. Se você estiver incorporando tópicos em um domínio diferente do seu site Discourse, adicione o domínio do seu site externo em Admin > Avançado > Incorporação > Hosts.

Por exemplo, se o seu site Discourse estiver localizado em seufórumdiscourse.com e você quiser incorporar tópicos em seusiteexterno.com, você precisa adicionar seusiteexterno.com à sua lista de Hosts Permitidos.

:warning: Você não pode incorporar tópicos de um site Discourse privado que exija login.

Parâmetros de configuração

O elemento d-topics-list suporta os seguintes atributos para personalizar a exibição dos seus tópicos:

  • discourse-url - O URL do seu site Discourse (obrigatório)
  • template - Opções de estilo de exibição:
    • basic (padrão) - Exibe informações mínimas do tópico
    • complete - Exibe título, nome de usuário, avatar, data de criação e miniatura
  • per-page - Número de tópicos a serem exibidos
  • category - ID da categoria para filtrar tópicos de uma categoria específica
  • tags - Filtrar tópicos por tags específicas
  • allow-create - Quando definido como true, exibe um botão “Novo Tópico”
  • top_period - Exibir os tópicos mais populares de um período específico:
    • all
    • yearly
    • quarterly
    • monthly
    • weekly
    • daily

Você pode combinar vários parâmetros para refinar a exibição da sua lista de tópicos. Por exemplo:

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

Personalizando a aparência

Você pode estilizar os tópicos incorporados usando SCSS personalizado no seu painel Admin > Personalizar > Temas. Clique no seu tema atual ou padrão e clique em Editar Código. Você pode então selecionar Show_advanced e escolher Embedded CSS para adicionar seu código personalizado:

Aqui está um exemplo de SCSS para criar um layout de grade:

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

Melhores práticas

  • Use filtros de categoria e tag significativos para exibir conteúdo relevante para seu público
  • Defina um valor apropriado para per-page para evitar sobrecarregar os visitantes
  • Teste seus tópicos incorporados em diferentes tamanhos de tela para garantir um design responsivo
  • Considere usar o template complete para um melhor apelo visual quando o espaço permitir
  • Revise regularmente sua lista de Hosts Permitidos para garantir que apenas domínios autorizados possam incorporar seus tópicos

Problemas comuns e soluções

Tópicos não são exibidos no domínio externo

Problema: Os tópicos incorporados aparecem como uma caixa em branco ou cinza quando visualizados em um domínio externo.

Solução: Adicione o domínio externo aos Admin > Personalizar > Incorporação > Hosts Permitidos do seu site Discourse. Certifique-se de incluir o subdomínio correto (por exemplo, se o seu site usa www.example.com, adicione www.example.com em vez de apenas example.com).

Erros de carregamento de script

Problema: O script de incorporação falha ao carregar ou retorna erros de conexão.

Solução:

  • Verifique se o URL do Discourse na sua fonte de script está correto e acessível
  • Verifique se a configuração de site embed_topics_list está habilitada
  • Certifique-se de que seu site Discourse não exija login para tópicos públicos

Comportamento do contexto SameSite

Em contextos SameSite onde o site de incorporação e o fórum compartilham um domínio pai, o Discourse respeita o status de login e exibe os resultados de acordo. Usuários logados podem ver conteúdo de categorias seguras que usuários anônimos não podem acessar.

FAQs

P: Posso incorporar tópicos de um site Discourse privado?
R: Não, a incorporação de tópicos só funciona com sites Discourse públicos. Sites privados que exigem login não podem ser incorporados.

P: Posso incorporar várias listas de tópicos na mesma página?
R: Sim, você pode incluir vários elementos <d-topics-list> na mesma página com parâmetros diferentes para exibir várias coleções de tópicos.

P: Como incorporo tópicos com imagens em destaque?
R: Use o parâmetro template="complete" no seu elemento <d-topics-list> para exibir tópicos com miniaturas e imagens em destaque.

P: Posso alterar onde os links dos tópicos são abertos?
R: Por padrão, os links dos tópicos são abertos na janela pai. Você pode modificar esse comportamento por meio de personalização CSS ou JavaScript.

Recursos adicionais

9 curtidas

Isso funciona com assinaturas do Discourse? Tentei implementá-lo e ele estava enquadrando todo o meu fórum em vez de tópicos?

1 curtida

Sim, isso deve funcionar em conjunto com o plugin Discourse Subscriptions sem problemas.

A incorporação depende da configuração de parâmetros específicos para controlar quais tópicos são exibidos, como category, tags ou per-page, através da tag d-topics-list no HTML do seu site. Se a sua incorporação acabou enquadrando todo o seu fórum, você pode querer garantir que a URL do Discourse e quaisquer parâmetros na tag d-topics-list estejam corretamente definidos para refletir os tópicos que você pretende exibir.

4 curtidas

Oi, é muito bom! Obrigado!

Quero alterar o valor do alvo do elemento a do topic-list-item para “_blank” (o padrão é “_parent”, tem problema de domínio cruzado e não é o que eu quero),

o que devo fazer?

Olá, estou tentando exibir isso em 2 sites diferentes.

Meu URL do Discourse é https://learn.getupearlier.com

Tenho este script incorporado aqui e está funcionando:

Tenho o mesmo script incorporado aqui e não está funcionando:

Isto está no cabeçalho:

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

Isto está na página:

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

Qualquer ajuda é apreciada!

2 curtidas

Olá Michael,

O problema que você está enfrentando aqui provavelmente está relacionado ao uso de um domínio diferente do seu domínio Discourse para incorporar os tópicos.

Seu script está funcionando em getupearlier.com porque está no mesmo domínio do seu site Discourse learn.getupearlier.com, enquanto michaelbakerdigital.com está em um domínio diferente.

Adicionei esta seção ao guia, que explica como resolver essa situação.

Portanto, para sua situação, adicionar michaelbakerdigital.com à “Incorporação” → “Hosts Permitidos” do seu site Discourse deve permitir que você incorpore corretamente os tópicos nesse domínio.

6 curtidas

Olá, permiti este URL como você pode ver abaixo:

Aqui está o URL de teste:
https://www.michaelbakerdigital.com/discourse-test/

Eu apenas recebo uma caixa de erro cinza em branco

E este é o 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>

Ou isto:

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

Qualquer ajuda é bem-vinda, estou preso aqui há muito tempo e sempre quis resolver isso.

Olá, a solução aqui foi que meu nome de domínio, que foi adicionado à seção de incorporação, precisava de www.

É isso! Tanto tempo para 4 caracteres, mas resolvi com a ajuda do suporte do Discourse e do WP Engine.

Existe um código de exemplo para usar para exibir uma imagem em destaque em um site externo?

Muito obrigado

Ajuda Necessária: Incorporando Lista de Tópicos do Discourse em Site Next.js

Olá a todos,

Estou tentando incorporar uma lista de tópicos do Discourse no meu site (example.io), que é construído com o framework Next.js e Node.js, implantado através da Vercel. Criei uma réplica de teste do site em test-discourse.app para este propósito.

Aqui está o que fiz até agora:

  1. Adicionei o host às configurações de incorporação do Discourse.
  2. Ativei o CORS no ambiente e adicionei o host à origem do CORS.
  3. Desativei o CSP (Content Security Policy).

Apesar de seguir estes passos e adicionar os scripts necessários, ainda não consigo ver a lista de tópicos no meu site.

Aqui está o código que estou usando:

Na seção head:

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

Na seção body:

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

Também tentei a incorporação de categorias, como mostrado na postagem.

Alguém poderia me indicar o que posso estar perdendo ou fazendo de errado? Qualquer sugestão para fazer a lista de tópicos aparecer no meu site seria muito apreciada.

Agradeço antecipadamente pela ajuda!

Tenho uma instância do Discourse rodando em um VPS
Tenho outro site rodando em um VPS diferente
Ambos têm o mesmo domínio raiz, por exemplo

community.mydomain.com
mydomain.com

Consegui usar este método para incorporar uma lista de tópicos do servidor do fórum (Discourse) em outro site. É ótimo para gerar tráfego do meu site para o fórum.

Uso o componente de blocos da barra lateral direita para listar ‘próximos eventos’ de um calendário usando o plugin discourse-calendar

Gostaria de replicar os ‘próximos eventos’ em meu outro site. Posso usar o método descrito neste tópico para obter todos os tópicos em minha categoria de calendário, mas eles são ordenados por postagem mais recente

O componente de blocos da barra lateral direita os ordena pela data do evento
exemplo

Existe uma maneira de fazer isso? Tenho controle administrativo sobre ambos os sites.
Existe outra maneira de extrair dados do meu servidor Discourse, como a API? A API é instalada em todas as instâncias do Discourse por padrão ou preciso instalá-la?

1 curtida

Como não recebi nenhuma dica, pensei em responder a algumas das minhas próprias perguntas para quem estiver procurando

apenas para referência SIM, a instalação auto-hospedada instalação oficial incluiu a API REST

Recebi dicas do tópico de exemplo da API sobre como fazer chamadas cURL do terminal. Depois que os comandos cURL funcionaram, usei este site para converter a versão da linha de comando para PHP

Meu outro servidor executa PHP como backend e faço chamadas ajax da página da web para funcionar no servidor. O Discourse gera json e javascript que ele construiu para decodificar isso. Estilize conforme necessário… sopa
note que isso pode funcionar apenas porque

e eu uso chave de API e usuário por como encontrar aqui
espero que ajude alguém :+1:

1 curtida

Parece que também podemos usar o link de incorporação em uma postagem de fórum, assim:\n\n<iframe> width=\"500\" height=\"400\" src=\"https://meta.discourse.org/embed/topics?tags=release-notes\" frameborder=0 scrolling=\"no\"></iframe>\n\n(não funcionará aqui porque eles não habilitaram seu próprio site nas configurações de administração do iframe)\n\nNo entanto, scrolling=\"no\" não funciona… Aparentemente, o órgão normatizador descontinuou a rolagem no HTML5 e a substituiu por… nada. Iframes só melhoram a cada ano, né?\n\nEm meus testes, se eu mudar o <body> dentro do iframe para overflow: hidden, a barra de rolagem horizontal desaparece. Não encontrei uma maneira de fazer a vertical desaparecer. Do meu plugin, há alguma maneira de modificar a página de incorporação para definir overflow: hidden?

Ao incorporar uma lista de tópicos, qual seria a “melhor” maneira se eu quiser criar um carrossel a partir de todos os tópicos incorporados com rolagem horizontal?

Existe alguma maneira de alterar cada link de tópico para ser aberto em uma nova aba/janela?