orenwolf
(Ken Snider)
7월 8, 2020, 6:51오후
1
안녕하세요,
이것이 wp-discourse 플러그인 자체의 문제인지, 아니면 Discourse의 HTML 파서 자체의 문제인지는 정확히 모르겠지만, wp-discourse를 통해 생성된 게시물에서 여러 줄에 걸친 HTML 주석이 숨겨지지 않는 것 같습니다.
최근에 Cory Doctorow의 pluralistic.net 게시물을 기반으로 chinwag.pluralistic.net을 설정을 마쳤습니다. 그의 게시물에는 상단에 HTML 주석 형태의 메타데이터가 포함되어 있습니다. 최근 이 형식이 단일 줄에서 여러 줄로 변경되었습니다.
다음 게시물에서 확인하실 수 있습니다:
Originally published at: https://pluralistic.net/2020/07/04/pluralistic-04-jul-2020/ Today's links What to the Slave Is the 4th of July: Scan of the original 1852 pamphlet. This day in history: 2010, 2015, 2019 Colophon: Recent...
원본 기사의 단일 줄 주석은 제거되었습니다:
그러나 이후 게시물의 여러 줄 주석은 그대로 표시됩니다:
simon
7월 8, 2020, 7:34오후
2
문제가 WordPress 플러그인 때문에 발생하는 것 같지는 않습니다. 다음은 Discourse가 주석으로 해석하지 않는 마크업의 예시입니다:
<p><!--
Tags:
Summary:
New podcast; Europe's interop coalition; Scarfolk beermats; Miami cop owns illegal mansion nightclub; Video and transcript of my OII talk; Shower temperature vs handle position
URL:
https://pluralistic.net/2020/07/06/polbathic/
Title:
Pluralistic: 06 Jul 2020 polbathic
Bullet:
🧔🏿
Separator:
_,.-'~'-.,__,.-'~'-.,__,.-'~'-.,__,.-'~'-.,__,.-'~'-.,_
Top Sources:
Today's top sources: Fipi Lele, Naked Capitalism (https://www.nakedcapitalism.com/).
--><br></p>
다음과 같이 렌더링됩니다:
문제는 주석 내부의 빈 줄이 Discourse에 의해 단락으로 해석된다는 점입니다. 그렇게 되면 HTML 주석이 더 이상 유효한 마크업이 아닙니다. 주석 내부의 빈 줄을 제거하면 Discourse가 올바르게 해석합니다:
<p><!--
Tags:
Summary:
New podcast; Europe's interop coalition; Scarfolk beermats; Miami cop owns illegal mansion nightclub; Video and transcript of my OII talk; Shower temperature vs handle position
URL:
https://pluralistic.net/2020/07/06/polbathic/
Title:
Pluralistic: 06 Jul 2020 polbathic
Bullet:
🧔🏿
Separator:
_,.-'~'-.,__,.-'~'-.,__,.-'~'-.,__,.-'~'-.,__,.-'~'-.,_
Top Sources:
Today's top sources: Fipi Lele, Naked Capitalism (https://www.nakedcapitalism.com/).
--><br></p>
Discourse에 게시물을 게시하기 전에 게시물 내용을 편집하는 것 외에는 이 문제를 해결하는 최선의 접근 방식이 무엇인지 확신이 서지 않습니다.
simon
7월 8, 2020, 10:31오후
3
아마도 이 문제를 해결하는 가장 좋은 방법은 게시물을 Discourse에 게시하기 전에 게시물에서 댓글을 제거하는 것입니다. 플러그인이 기본적으로 이렇게 처리해야 할 수도 있지만, 제가 이 문제를 만난 것은 처음입니다.
WP Discourse 플러그인에는 Discourse에 게시하기 전에 게시물 내용을 파싱할 수 있는 필터가 있습니다. 이 필터의 이름은 wp_discourse_excerpt입니다. 게시물 내용이 변수로 전달됩니다. 아래는 WordPress 게시물이 Discourse에 게시되기 전에 모든 댓글을 제거하는 데 이 필터를 사용하는 방법입니다. 이 패턴을 사용하여 게시물을 다른 방식으로 수정하는 데에도 사용할 수 있습니다:
add_filter( 'wp_discourse_excerpt', 'wpdc_custom_discourse_excerpt' );
function wpdc_custom_discourse_excerpt( $html ) {
if ( ! extension_loaded( 'libxml' ) ) {
return $html;
}
$use_internal_errors = libxml_use_internal_errors( true );
$disable_entity_loader = libxml_disable_entity_loader( true );
$html_doc = '<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/></head><body>' . $html . '</body></html>';
$doc = new \DOMDocument( '1.0', 'utf-8' );
$doc->loadHTML( $html_doc );
$finder = new \DOMXPath( $doc );
$comments = $finder->query( '//comment()' );
if ( $comments->length ) {
foreach ( $comments as $comment ) {
$comment->parentNode->removeChild( $comment );
}
$parsed = $doc->saveHTML( $doc->documentElement );
libxml_clear_errors();
libxml_use_internal_errors( $use_internal_errors );
libxml_disable_entity_loader( $disable_entity_loader );
return preg_replace( '~<(?:!DOCTYPE|/?(?:html|head|meta|body))[^>]*>\s*~i', '', $parsed );
}
libxml_clear_errors();
libxml_use_internal_errors( $use_internal_errors );
libxml_disable_entity_loader( $disable_entity_loader );
return $html;
}
이 코드를 WordPress 테마의 functions.php 파일에 추가하면 문제가 해결되어야 합니다. 작동하지 않는 경우, WordPress 사이트 서버에서 libxml 확장 기능이 활성화되어 있는지 확인하십시오.
orenwolf
(Ken Snider)
7월 9, 2020, 10:34오후
4
정말 시도해 보겠지만, 댓글에 HTML 엔티티가 포함되어 있으면 Discourse가 해당 댓글을 이제 무효한 HTML로 판단하게 되니, 이는 더 큰 문제인 것 같지 않나요?
simon
7월 9, 2020, 11:00오후
5
Discourse가 이 문제를 어떻게 처리해야 하는지 확신이 서지 않습니다. Discourse에서 직접 생성된 게시물의 경우, 제한된 HTML 하위 집합만 지원한다고 명시하는 것이 합리적이라고 생각합니다. 하지만 API를 통해 생성되거나 RSS 피드를 가져와서 생성된 게시물의 경우, Discourse가 HTML을 얼마나 지원해야 하는지는 명확하지 않습니다.
위에서 공유한 코드를 WP Discourse 플러그인에 직접 추가하는 것이 합리적이라고 생각합니다. 이 플러그인은 이미 Discourse에서 WordPress로 가져온 댓글을 정리하는 데 유사한 기능을 사용하고 있습니다. 이 기능은 오랫동안 사용되어 왔으며, 문제점에 대한 보고는 없었습니다. 이 문제에 대해 며칠 이내에 다시 알려 드리겠습니다.
simon
7월 11, 2020, 9:44오후
6
이 내용은 WP Discourse 버전 2.0.6 에 추가되었습니다. WordPress에서 Discourse로 전체 게시글 내용이 게시되면, 게시글에 포함된 모든 댓글 블록은 Discourse로 전송되기 전에 제거됩니다.
orenwolf
(Ken Snider)
7월 11, 2020, 10:16오후
7
고마워요, 시몬! 이용 가능해지면 바로 설치해서 다시 알려드릴게요.
예상 시간: 완벽하게 작동해요. 감사합니다!