Я отлаживаю проблему с нашим сторонним скриптом, который используют пользователи WordPress, скопировав / вставив фрагмент скрипта и html в тела своего поста, например (пример не из реального мира):
<script>
window.foobar = window.foobar || { hello: function(){ console.log('Hello World'); } };
window.foobar.hello();
</script>
Я заметил, что некоторые установки WordPress обернут это в CDATA, а некоторые - нет (возможно, с помощью какой-то проверки DOCTYPE - хотя все темы, на которых я проверял это, использовали тип документа HTML5).
Тем не менее, при переносе скрипта в CDATA пользователи будут укушены следующей ошибкой: https://core.trac.wordpress.org/ticket/3670 (закрытие >
неправильно заменено на >
), которая приводит к тому, что браузер игнорирует содержимое скрипта. :
<script>// <![CDATA[ window.foobar = window.foobar || { hello: function(){ console.log('Hello World'); } }; window.foobar.hello(); // ]]></script>
Я сам не слишком много владею WP-Fu, и поиск в Google привел меня к выявлению проблемы как есть, поэтому мой вопрос был бы таков: когда именно WordPress переносит встроенные скрипты в разделы CDATA? Может ли пользователь как-то предотвратить это поведение? Может ли пользователь как-то обойти вышеуказанную ошибку, не модифицируя ядро WP?
источник
Ответы:
На самом деле, это не WordPress, который вставляет
CDATA
теги, а визуальный редактор TinyMCE. Подробная информация о TinyMCE здесь оффтопна, но решение об этом вы можете прочитать в Stackoverflow .Тем не менее, остановка TinyMCE не может быть полным решением, которое вы хотите. В самом WordPress также есть функция добавления
CDATA
тегов,wxr_cdata
которая используется при выводе действительного xml-файла, например, если вы хотите экспортировать файл из содержимого в rss-ленту. Темы и / или плагины могут решить присоединить этот фильтр к контенту, если они хотят, чтобы документ был действительным xhtml.Здесь вы можете столкнуться с ошибкой , которая была впервые задокументирована двенадцать лет назад и остается нерешенной. Это об этих трех строках
the_content
:Как вы можете видеть,
str_replace
он жестко закодирован, за ним сразу следует эхо. Нет способа перехватить эту замену.Что вы можете сделать, однако, если вы контролируете свою тему, это буфер
the_content
и обратная замена. Как это:источник