Discourse Signatures

자, 서명을 그룹에 맞게 더 잘 작동하게 만들고 싶은 분들을 위해 (특히 유료 업그레이드/구독의 일부로 서명을 사용하려는 경우), 훨씬 더 나은 결과를 내어 업그레이드를 더 많이 유도할 수 있다고 생각하는 코드(그리고 그 배경)를 공유합니다. 여러 번 시도해야 했지만, 지금은 잘 작동하고 있습니다. “XXXXX” 부분을 대체해야 할 위치를 주의 깊게 확인하세요.

저는 다음 두 가지를 달성하고 싶었습니다:

A) 서명을 비활성화할 수 있는 기능을 제거하고 싶었습니다. 즉, 업그레이드를 한 사용자는 자신의 서명이 모든 사람에게 보일 것이라는 점을 알게 됩니다.

B) 서명을 생성할 수 있는 권한을 특정 그룹에만 부여하고 싶었습니다.

  1. 관리자 > 외관 > 테마 및 컴포넌트 > 컴포넌트 > 설치 > 새로 만들기로 이동하세요.

  2. < head > 탭에 다음 코드를 추가하세요:

<script>
// 먼저 기본 페이지 구조가 로드되기를 기다립니다
document.addEventListener("DOMContentLoaded", function() {
    
    // 관찰자 설정
    const observer = new MutationObserver(function(mutations) {
        // 페이지의 모든 제어 레이블 찾기
        const labels = document.querySelectorAll('label.control-label');
        
        labels.forEach(label => {
            // 특정 서명 레이블 찾기
            if (label.textContent.trim() === 'Enable Signatures') {
                // 레이블과 체크박스를 모두 포함하는 메인 컨테이너를 찾아 숨기기
                const controlGroup = label.closest('.control-group') || label.parentElement;
                if (controlGroup) {
                    controlGroup.style.display = 'none';
                }
            }
        });
    });

    // 이제 body가 존재한다는 것을 알기 때문에 관찰 시작
    observer.observe(document.body, { childList: true, subtree: true });
});
</script>

3. css 탭에 다음 코드를 추가하세요 (XXXXX를 그룹 이름으로 대체하세요):

/* 모든 사용자에게 서명 섹션을 숨김 */
.user-preferences .control-group.signatures,
.user-preferences .signature-preferences,
.user-preferences div[data-setting-name="user_card_badge"] + .control-group {
    display: none !important;
}

/* body에 'user-is-XXXXX' 클래스가 존재할 경우에만 표시 */
body.user-is-XXXXX .user-preferences .control-group.signatures,
body.user-is-XXXXX .user-preferences .signature-preferences,
body.user-is-XXXXX .user-preferences div[data-setting-name="user_card_badge"] + .control-group {
    display: block !important;
}
  1. 위에서 언급한 첫 번째 블록 아래에 < head > 태그에 다음 코드를 추가하세요 (XXXXX를 그룹 이름으로 대체하세요):
<script>
(function() {
  const checkAccess = () => {
    // Discourse는 현재 사용자의 그룹을 이 전역 객체에 저장합니다
    const user = window.Discourse && window.Discourse.User && window.Discourse.User.current();
    
    if (user && user.groups) {
      // 그룹 이름 중 "XXXXX"와 일치하는 것이 있는지 확인
      const is XXXXX = user.groups.some(g => g.name === 'XXXXX');
      
      if (isXXXXX) {
        document.body.classList.add('user-is-XXXXX');
      }
    }
  };

  // 즉시 실행
  checkAccess();

  // 사용자가 페이지 사이를 이동할 때마다 실행
  document.addEventListener('discourse-ready', checkAccess);
  
  // 백업: 느린 로드를 잡기 위해 1초 후 다시 실행
  setTimeout(checkAccess, 1000);
})();
</script>
  1. 위에서 언급한 첫 번째 블록 아래에 css 탭에 다음 코드를 추가하세요 (XXXXX를 그룹 이름으로 대체하세요):
/* 모든 사용자에게 서명 섹션을 숨김 */
.user-preferences .control-group.signatures,
.user-preferences .signature-preferences,
.user-preferences div[data-setting-name="user_card_badge"] + .control-group {
    display: none !important;
}

/* body에 'user-is-XXXXX' 클래스가 존재할 경우에만 표시 */
body.user-is-XXXXX .user-preferences .control-group.signatures,
body.user-is-XXXXX .user-preferences .signature-preferences,
body.user-is-XXXXX .user-preferences div[data-setting-name="user_card_badge"] + .control-group {
    display: block !important;
}

완료.

저는 개발자가 아닙니다. 제가 아는 것은 제 사이트에서 이 코드가 100% 잘 작동한다는 것뿐입니다.

또한, 플러그인 개발자에게 드리는 말씀입니다 – 서명 문자 수를 제한할 수 있는 기능이 있으면 좋겠습니다. 많은 시도를 해봤지만 아무것도 작동하지 않았습니다.

1개의 좋아요