외부 사이트에 Discourse 주제 목록 임베드하기

:bookmark: 이 가이드는 JavaScript를 사용하여 외부 웹사이트에 Discourse 주제 목록을 임베드하고 표시하는 방법을 설명합니다. 이를 통해 블로그, 웹사이트 또는 외부 콘텐츠 플랫폼에 토론이나 공지 사항과 같은 포럼 콘텐츠를 보여줄 수 있습니다.

:person_raising_hand: 필요한 사용자 권한: 관리자

요약

외부 웹사이트에 Discourse 주제를 임베드하면 Discourse 포럼의 주제 목록을 다른 사이트에 직접 표시할 수 있습니다. 이 통합은 포럼으로의 트래픽을 유도하고 청중이 커뮤니티 콘텐츠와 지속적으로 상호작용하도록 돕습니다. 임베드된 주제는 웹사이트의 DOM 구조와 통합되는 JavaScript 위젯으로 나타나며, 이를 통해 CSS를 사용하여 쉽게 사용자 정의할 수 있습니다.

주제 임베드 활성화

외부 사이트에서 주제 임베드를 설정하려면:

  1. 관리자 > 고급 > 임베딩으로 이동하여 설정 탭으로 전환합니다. embed_topics_list 사이트 설정을 활성화합니다.

  1. 외부 사이트의 HTML head 섹션에 임베딩 스크립트를 추가합니다:
<script src="https://discourse.example.com/javascripts/embed-topics.js"></script>

discourse.example.com을 실제 Discourse 포럼의 URL로 교체합니다.

  1. 주제를 표시할 위치에 주제 목록 요소를 배치합니다(예: 블로그 게시물 또는 개별 사이트 페이지):
<d-topics-list discourse-url="https://discourse.example.com" category="1234" per-page="5"></d-topics-list>
  1. Discourse 사이트와 다른 도메인에서 주제를 임베드하는 경우, 외부 사이트의 도메인을 관리자 > 고급 > 임베딩 > 호스트에 추가합니다.

예를 들어, Discourse 사이트가 yourdiscourseforum.com에 위치해 있고 yourexternalsite.com에서 주제를 임베드하려는 경우, 허용된 호스트 목록에 yourexternalsite.com을 추가해야 합니다.

:warning: 로그인 필수인 비공개 Discourse 사이트의 주제는 임베드할 수 없습니다.

구성 매개변수

d-topics-list 요소는 주제 표시를 사용자 정의하기 위해 다음 속성을 지원합니다:

  • discourse-url - Discourse 사이트의 URL (필수)
  • template - 표시 스타일 옵션:
    • basic (기본값) - 주제 제목을 링크로 표시
    • complete - 제목, 사용자 이름, 아바타, 생성 날짜, 마지막 답변 시간, 좋아요 수, 답변 수, 특징 이미지/썸네일 표시
  • per-page - 표시할 주제 수 (숨겨진 embed_topic_limit_per_page 사이트 설정으로 제한되며, 기본값 200)
  • category - 특정 카테고리의 주제를 필터링할 카테고리 ID
  • tags - 특정 태그로 주제 필터링
  • allow-create - true로 설정되면 “새 주제” 버튼 표시
  • embed-class - 임베드된 주제 목록 컨테이너에 사용자 정의 CSS 클래스 추가 (영숫자, 하이픈, 밑줄만 허용)
  • top-period - 특정 기간의 상위 주제 표시:
    • all
    • yearly
    • quarterly
    • monthly
    • weekly
    • daily

여러 매개변수를 조합하여 주제 목록 표시를 세밀하게 조정할 수 있습니다. 예를 들어:

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

외관 사용자 정의

관리자 > 외관 > 테마 및 구성 요소 패널에서 사용자 정의 SCSS를 사용하여 임베드된 주제의 스타일을 설정할 수 있습니다. 현재 또는 기본 테마를 클릭하고 코드 편집을 클릭합니다. 그런 다음 Show_advanced를 선택하고 임베드된 CSS를 선택하여 사용자 코드를 추가합니다:

그리드 레이아웃을 만들기 위한 SCSS 예시입니다:

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

모범 사례

  • 청중에게 관련 있는 콘텐츠를 표시하기 위해 의미 있는 카테고리 및 태그 필터를 사용하세요.
  • 방문자가 압도당하지 않도록 적절한 per-page 값을 설정하세요.
  • 반응형 디자인을 보장하기 위해 다양한 화면 크기에서 임베드된 주제를 테스트하세요.
  • 공간이 허용되는 경우 더 나은 시각적 매력을 위해 complete 템플릿 사용을 고려하세요.
  • 승인된 도메인만 주제를 임베드할 수 있도록 허용된 호스트 목록을 정기적으로 검토하세요.

일반적인 문제 및 해결 방법

외부 도메인에서 주제가 표시되지 않음

문제: 외부 도메인에서 임베드된 주제가 빈 박스나 회색 박스로 나타납니다.

해결 방법: 외부 도메인을 Discourse 사이트의 관리자 > 고급 > 임베딩 > 호스트에 추가하세요. 올바른 서브도메인을 포함해야 합니다(예: 사이트가 www.example.com을 사용하는 경우, example.com만 추가하는 것이 아니라 www.example.com을 추가해야 합니다).

스크립트 로딩 오류

문제: 임베드 스크립트가 로드되지 않거나 연결 오류가 반환됩니다.

해결 방법:

  • 스크립트 소스에서 Discourse URL이 정확하고 접근 가능한지 확인하세요.
  • embed_topics_list 사이트 설정이 활성화되어 있는지 확인하세요.
  • 공개 주제에 대해 Discourse 사이트가 로그인 필수로 설정되어 있지 않은지 확인하세요.

SameSite 컨텍스트 동작

임베딩 사이트와 포럼이 상위 도메인을 공유하는 SameSite 컨텍스트에서, Discourse는 로그인 상태를 존중하여 그에 따라 결과를 표시합니다. 로그인한 사용자는 익명 사용자가 접근할 수 없는 보안 카테고리의 콘텐츠를 볼 수 있습니다.

자주 묻는 질문

Q: 비공개 Discourse 사이트의 주제를 임베드할 수 있나요?
A: 아니요, 주제 임베드는 공개 Discourse 사이트에서만 작동합니다. 로그인 필수인 비공개 사이트는 임베드할 수 없습니다.

Q: 동일한 페이지에 여러 주제 목록을 임베드할 수 있나요?
A: 네, 다른 매개변수를 사용하여 다양한 주제 컬렉션을 표시하기 위해 동일한 페이지에 여러 <d-topics-list> 요소를 포함할 수 있습니다.

Q: 특징 이미지가 있는 주제를 임베드하는 방법은 무엇인가요?
A: <d-topics-list> 요소에서 template="complete" 매개변수를 사용하여 썸네일과 특징 이미지가 있는 주제를 표시하세요.

Q: 주제 링크가 열리는 위치를 변경할 수 있나요?
A: 기본적으로 주제 링크는 부모 창에서 열립니다. CSS 또는 JavaScript 사용자 정의를 통해 이 동작을 수정할 수 있습니다.

추가 리소스

11개의 좋아요

이것이 Discourse 구독과 함께 작동하나요? 구현을 시도해 보았지만, 전체 포럼이 아니라 개별 주제에서 프레임이 표시되었습니다?

1개의 좋아요

네, Discourse Subscriptions 플러그인과 함께 문제없이 함께 작동해야 합니다.

임베딩은 category, tags, per-page와 같은 특정 매개변수를 구성하여 표시할 주제를 제어하는 데 의존하며, 이는 웹사이트 HTML의 d-topics-list 태그를 통해 이루어집니다. 임베딩이 포럼 전체를 프레임으로 표시하게 되었다면, <d-topics-list> 태그의 Discourse URL과 매개변수가 표시하려는 주제를 반영하도록 올바르게 설정되어 있는지 확인하는 것이 좋습니다.

4개의 좋아요

안녕하세요, 정말 좋습니다! 감사합니다!

topic-list-item의 a 요소 target 값을 "_blank"로 변경하고 싶습니다(기본값은 _parent이며, 도메인 간 문제가 발생하고 제가 원하는 것이 아닙니다).

어떻게 해야 하나요?

안녕하세요, 이 내용을 두 개의 다른 사이트에 표시하려고 하고 있습니다.

제 discourse URL은 https://learn.getupearlier.com 입니다.

아래 링크에 해당 스크립트를 임베드했는데 정상적으로 작동합니다:

아래 링크에도 동일한 스크립트를 임베드했는데 작동하지 않습니다:

헤더에는 다음 코드가 있습니다:

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

페이지에는 다음 코드가 있습니다:

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

도움 주시면 감사하겠습니다!

2개의 좋아요

Michael님,

여기서 겪고 계신 문제는 Discourse 도메인과 다른 도메인에 토픽을 내장(embed)하는 것과 관련이 있을 가능성이 높습니다.

getupearlier.com에서는 스크립트가 작동하는 이유는 이것이 Discourse 사이트 learn.getupearlier.com와 동일한 도메인에 속하기 때문이고, michaelbakerdigital.com은 다른 도메인에 속하기 때문입니다.

이 상황을 해결하는 방법을 설명하는 섹션을 가이드에 추가했습니다.

따라서 Michael님의 경우, Discourse 사이트의 “Embedding” → "Allowed Hosts"에 michaelbakerdigital.com을 추가하면 해당 도메인에 토픽을 올바르게 내장할 수 있게 될 것입니다.

6개의 좋아요

안녕하세요. 아래에서 볼 수 있듯이 해당 URL을 허용했습니다:

테스트 URL은 다음과 같습니다:

하지만 빈 회색 오류 상자만 표시됩니다.

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>

아니면 이 코드입니다:

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

도움을 주시면 감사하겠습니다. 이 문제로 인해 정말 오래 막혀있었고, 계속 해결하려고 노력하고 있습니다.

여기서 해결책은 임베드(Embed) 섹션에 추가된 도메인 이름에 www.가 필요했다는 것이었습니다.

이것이 전부입니다! 4자 때문에 이렇게나 많은 시간이 걸렸지만, Discourse와 WP Engine 지원팀의 도움으로 해결했습니다.

외부 사이트에 특징 이미지를 출력하는 데 사용할 수 있는 예제 코드가 있나요?

감사합니다.

도움 요청: Next.js 사이트에 Discourse 주제 목록 임베딩

안녕하세요,

Next.js 프레임워크와 Node.js로 구축되어 Vercel을 통해 배포된 제 웹사이트(example.io)에 Discourse 주제 목록을 임베딩하려고 합니다. 이를 위해 test-discourse.app에서 웹사이트의 테스트 복제본을 만들었습니다.

지금까지 수행한 작업은 다음과 같습니다:

  1. Discourse 임베딩 설정에 호스트를 추가했습니다.
  2. 환경에서 CORS를 활성화하고 호스트를 CORS 원본에 추가했습니다.
  3. CSP(콘텐츠 보안 정책)를 비활성화했습니다.

이러한 단계를 따르고 필요한 스크립트를 추가했음에도 불구하고 제 웹사이트에서 주제 목록을 볼 수 없습니다.

사용 중인 코드는 다음과 같습니다:

head 섹션에서:

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

body 섹션에서:

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

게시글에 나와 있는 대로 카테고리 임베딩도 시도해 보았습니다.

누구 제게 무엇이 빠져 있거나 잘못되고 있는지 알려 주실 수 있을까요? 제 웹사이트에 주제 목록이 표시되도록 도와줄 수 있는 조언을 부탁드립니다.

도움 주셔서 감사합니다!

VPS에서 Discourse 인스턴스를 실행하고 있습니다.
다른 VPS에서는 별도의 웹사이트를 운영 중입니다.
두 사이트 모두 동일한 루트 도메인을 사용하고 있습니다. 예를 들어 다음과 같습니다.

community.mydomain.com
mydomain.com

이 방법을 사용하여 포럼 서버(Discourse)의 주제 목록을 다른 웹사이트에 임베드하는 데 성공했습니다. 웹사이트에서 포럼으로 트래픽을 유도하는 데 정말 효과적입니다.

discourse-calendar 플러그인을 사용하여 캘린더의 '예정된 이벤트’를 나열하는 우측 사이드바 블록 구성 요소를 사용하고 있습니다.

다른 웹사이트에도 이 '예정된 이벤트’를 동일하게 구현하고 싶습니다. 이 주제에서 설명된 방법을 사용하면 캘린더 카테고리의 모든 주제를 가져올 수는 있지만, 게시된 순서(최신순)로 정렬됩니다.

우측 사이드바 블록 구성 요소는 이벤트 날짜 기준으로 정렬합니다.
예시

이를 구현할 방법이 있을까요? 두 웹사이트 모두에 대한 관리자 권한을 가지고 있습니다.
Discourse 서버에서 데이터를 추출하는 다른 방법이 있을까요? 예를 들어 API를 사용할 수 있을까요? API는 모든 Discourse 인스턴스에 기본적으로 설치되어 있는 것인가요, 아니면 별도로 설치해야 하나요?

1개의 좋아요

힌트를 받지 못해서, 혹시 찾아보시는 분들을 위해 제 질문에 대한 답변을 몇 가지 정리해 보았습니다.

참고로, 네. 셀프 호스팅 공식 설치에는 REST API가 포함되어 있습니다.

api 예제 스레드에서 터미널에서 cURL 호출을 하는 방법에 대한 힌트를 얻었습니다. cURL 명령어가 작동하기 시작하자, 이 웹사이트를 사용하여 커맨드라인 버전을 PHP로 변환했습니다.

제 다른 서버는 백엔드로 PHP를 사용하며, 웹 페이지에서 서버의 함수로 ajax 호출을 수행합니다. Discourse는 json과 이를 디코딩하기 위해 생성한 javascript를 출력합니다. 필요에 따라 스타일을 지정하세요… 수프
이는 다음 조건이 충족될 때만 작동할 수 있습니다.

그리고 여기에서 찾은 방법에 따라 API 키와 사용자를 사용합니다.
누군가에게 도움이 되길 바랍니다 :+1:

1개의 좋아요

포럼 게시물에 임베드 링크를 이렇게 사용할 수도 있는 것 같습니다:

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

(여기서는 iframe 관리자 설정에서 자체 사이트가 활성화되어 있지 않아 작동하지 않습니다)

그러나 scrolling="no"는 작동하지 않습니다… Apparently 표준 기구는 HTML5에서 scrolling을 비추천(deprecated) 처리하고 대체할 것으로는… 아무것도 없습니다. iframe은 매년 점점 더 좋아지고 있군요, 그렇죠?

테스트해 본 결과, iframe 내부의 <body>를 overflow: hidden으로 변경하면 가로 스크롤바가 사라집니다. 세로 스크롤바를 없애는 방법은 아직 찾지 못했습니다. 제 플러그인에서 임베드 페이지를 수정하여 overflow: hidden을 설정할 수 있는 방법이 있을까요?

주제 목록을 임베드할 때, 모든 임베드된 주제로 가로 스크롤이 가능한 캐러셀을 만들고자 한다면 "최적"의 방법은 무엇일까요?

각 주제 링크를 새 탭/창에서 열도록 변경할 수 있는 방법이 있을까요?