Khi nào Wordpress bao bọc các tập lệnh nội tuyến trong CDATA?


11

Tôi đang gỡ lỗi một vấn đề với tập lệnh bên thứ ba của chúng tôi mà người dùng wordpress sử dụng bằng cách sao chép / dán đoạn mã script và html vào nội dung bài đăng của họ như (ví dụ về thế giới không có thực)

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

Tôi nhận thấy rằng một số cài đặt của wordpress sẽ gói nó trong CDATA, một số sẽ không (có thể bằng cách thực hiện một số loại kiểm tra DOCTYPE - mặc dù tất cả các chủ đề tôi đã thử nghiệm này đều sử dụng tài liệu HTML5).

Tuy nhiên, khi gói tập lệnh trong CDATA, người dùng sẽ bị cắn bởi lỗi sau: https://core.trac.wordpress.org/ticket/3670 (việc đóng >được thay thế không chính xác &gt;) dẫn đến trình duyệt bỏ qua nội dung tập lệnh :

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

Bản thân tôi không sở hữu quá nhiều WP-Fu và việc này chỉ khiến tôi xác định được vấn đề, vì vậy câu hỏi của tôi là: khi nào chính xác thì WordPress gói các đoạn mã nội tuyến vào các phần CDATA? Người dùng có thể bằng cách nào đó ngăn chặn hành vi này? Người dùng có thể bằng cách nào đó khắc phục lỗi trên mà không sửa đổi lõi WP không?


1
Khi dán JS nội tuyến trong trình soạn thảo, WP nên thực hiện hành vi này. Tôi khuyên bạn nên sử dụng JS bằng cách sử dụng wp_head hoặc wp_enqueue_script ..
Samuel Elh

Bạn có nghĩa là "cơ thể của bài" như trong trình soạn thảo WYSIWYG? Từ những gì tôi có thể thấy, JS được bọc trong các thẻ CDATA khi các tập lệnh được in (có thể được gọi theo một số cách) nhưng không thể lọc được. Tôi có thể tưởng tượng, nếu bạn làm có nghĩa là WYSIWYG của một bưu điện, nó có thể là một số cách lọc về nội dung thực hiện bởi các chủ đề.
Doug Belchamber 17/03/2017

1
Bạn không nên đăng javascript trong trình chỉnh sửa WYSIWYG. Trình chỉnh sửa có một số bộ lọc để dọn sạch nội dung của bạn tương tác kém với js nội tuyến. Có các plugin giúp trong loại kịch bản này.
MikeNGarrett

Câu trả lời:


1

Trên thực tế, không phải WordPress đang chèn các CDATAthẻ, mà là trình soạn thảo trực quan, TinyMCE. Chi tiết về TinyMCE không chính thức ở đây, nhưng bạn có thể đọc một giải pháp cho vấn đề này trên Stackoverflow .

Điều đó nói rằng, dừng TinyMCE có thể không phải là giải pháp đầy đủ mà bạn muốn. Bản thân WordPress cũng có chức năng thêm CDATAthẻ, wxr_cdatađược sử dụng khi xuất tệp xml hợp lệ, ví dụ nếu bạn muốn xuất tệp sử dụng nội dung trong nguồn cấp dữ liệu rss. Chủ đề và / hoặc plugin có thể quyết định đính kèm bộ lọc này vào nội dung nếu họ muốn tài liệu có giá trị xhtml.

Đây là nơi bạn sau đó gặp phải lỗi , lần đầu tiên được ghi nhận mười hai năm trước và vẫn chưa được giải quyết. Đó là về ba dòng trong the_content:

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

Như bạn có thể thấy, str_replacemã hóa cứng, ngay lập tức theo tiếng vang. Không có cách nào để chặn sự thay thế này.

Tuy nhiên, những gì bạn có thể làm, nếu bạn kiểm soát chủ đề của mình, là bộ đệm the_content và đảo ngược sự thay thế. Như thế này:

ob_start();
the_content();
$content = ob_get_clean();
$content = str_replace( ']]&gt', ']]>', $content ); 
echo $content;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.