Wordpress는 언제 CDATA에서 인라인 스크립트를 래핑합니까?


11

워드 프레스 사용자가 스크립트와 HTML을 복사하여 붙여 넣음으로써 사용하는 타사 스크립트와 관련된 문제를 디버깅하고 있습니다.

<script>
window.foobar = window.foobar || { hello: function(){ console.log('Hello World'); } };
window.foobar.hello();
</script>

나는 워드 프레스의 일부 설치가 이것을 CDATA에서 랩핑 할 것이고, 일부는 그렇지 않을 것입니다 (아마도 일종의 DOCTYPE 검사를 수행하여-이를 테스트 한 모든 테마는 HTML5 doctype을 사용했지만).

CDATA에서 스크립트를 포장 할 때 그러나, 사용자는 다음 버그에 물린 얻을 것이다 : https://core.trac.wordpress.org/ticket/3670 (폐쇄가 >잘못로 대체 &gt;) 스크립트의 내용을 무시하고 브라우저에있는 리드 :

<script>// <![CDATA[  window.foobar = window.foobar || { hello: function(){ console.log('Hello World'); } }; window.foobar.hello();  // ]]&gt;</script>

나는 너무 많은 WP-Fu를 소유하지 않고 인터넷 검색을 통해 문제를 그대로 식별 할 수 있었기 때문에 내 질문은 언제 : WordPress가 인라인 스크립트를 CDATA 섹션에 정확히 래핑합니까? 사용자가 어떻게 든이 동작을 막을 수 있습니까? WP 코어를 수정하지 않고도 사용자가 위의 버그를 해결할 수 있습니까?


1
편집기에서 인라인 JS를 붙여 넣을 때 WP가이 동작을 수행해야합니다. wp_head 또는 wp_enqueue_script를 사용하여 JS를 대기열에 넣는 것이 좋습니다 .
Samuel Elh

WYSIWYG 편집기에서와 같이 "포스트 바디"를 의미합니까? 내가 볼 수 있듯이 JS는 스크립트가 인쇄 될 때 (여러 가지 방법으로 호출 할 수 있지만) 필터링 할 수 없을 때 CDATA 태그로 래핑됩니다. 나는 당신 게시물의 WYSIWYG를 의미 한다면 , 주제에 의해 수행 된 내용에 대한 필터링 일 수 있다고 생각합니다.
Doug Belchamber

1
WYSIWYG 편집기에서 자바 스크립트를 게시하지 않는 것이 좋습니다. 편집기에는 인라인 js와 제대로 상호 작용하지 않는 컨텐츠를 정리하는 여러 필터가 있습니다. 이 유형의 시나리오에 도움이되는 플러그인이 있습니다.
MikeNGarrett

답변:


1

실제로, CDATA태그를 삽입하는 것은 WordPress가 아니라 시각적 편집기 TinyMCE입니다. TinyMCE에 대한 자세한 내용은 여기서 다루지 않지만 Stackoverflow에서 이에 대한 솔루션을 읽을 수 있습니다 .

그러나 TinyMCE를 중지하는 것이 원하는 전체 솔루션이 아닐 수도 있습니다. WordPress 자체에는 CDATA태그 를 추가하는 기능도 있습니다.이 기능 wxr_cdata은 유효한 xml 파일을 출력 할 때 사용됩니다 (예 : rss-feed의 컨텐츠를 사용하려는 파일을 내보내려는 경우). 테마 및 / 또는 플러그인은 문서가 유효한 xhtml이되도록하려면이 필터를 컨텐츠에 첨부하도록 결정할 수 있습니다.

여기서 12 년 전에 처음으로 문서화되어 해결되지 않은 상태로 버그 가 발생합니다 . 이 세 줄은 the_content다음 과 같습니다.

$content = apply_filters( 'the_content', $content );
$content = str_replace( ']]>', ']]&gt;', $content );
echo $content;

보시다시피, str_replace하드 코딩 된 후 바로 에코가 표시됩니다. 이 교체를 가로 챌 방법이 없습니다.

그러나 테마를 제어하는 ​​경우 수행 할 수있는 작업은 버퍼링 the_content 이며 대체를 취소하는 것입니다. 이처럼 :

ob_start();
the_content();
$content = ob_get_clean();
$content = str_replace( ']]&gt', ']]>', $content ); 
echo $content;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.