Estou depurando um problema com um script de terceiros que os usuários do wordpress usam copiando / colando um trecho de script e html nos corpos de seus posts, como (exemplo do mundo não real, é claro):
<script>
window.foobar = window.foobar || { hello: function(){ console.log('Hello World'); } };
window.foobar.hello();
</script>
Notei que algumas instalações do wordpress envolvem isso no CDATA, outras não (provavelmente fazendo algum tipo de verificação DOCTYPE - embora todos os temas em que eu testei isso usassem um doctype HTML5).
No entanto, ao agrupar o script no CDATA, os usuários serão mordidos pelo seguinte bug: https://core.trac.wordpress.org/ticket/3670 (o fechamento >
é substituído incorretamente por >
), o que leva o navegador a ignorar o conteúdo do script :
<script>// <![CDATA[ window.foobar = window.foobar || { hello: function(){ console.log('Hello World'); } }; window.foobar.hello(); // ]]></script>
Eu não possuo muito WP-Fu e o Google só me levou a identificar o problema como está, então minha pergunta seria: quando exatamente o WordPress agrupa scripts embutidos em seções CDATA? O usuário pode de alguma forma impedir esse comportamento? O usuário pode, de alguma forma, solucionar o bug acima sem modificar o núcleo do WP?
fonte
Respostas:
Na verdade, não é o WordPress que está inserindo as
CDATA
tags, mas o editor visual, TinyMCE. Os detalhes do TinyMCE são offtopic aqui, mas você pode ler uma solução para isso no Stackoverflow .Dito isto, interromper o TinyMCE pode não ser a solução completa que você deseja. O próprio WordPress também tem uma função para adicionar
CDATA
tags,wxr_cdata
que é usada na saída de um arquivo xml válido, por exemplo, se você deseja exportar o arquivo de uso do conteúdo em um feed RSS. Os temas e / ou plug-ins podem decidir anexar esse filtro ao conteúdo se quiserem que o documento seja xhtml válido.É aqui que você encontra o bug , que foi documentado pela primeira vez há doze anos e permanece sem solução. É sobre estas três linhas em
the_content
:Como você pode ver, o
str_replace
código é codificado, imediatamente seguido pelo eco. Não há como interceptar essa substituição.O que você pode fazer, no entanto, se você controla seu tema, é buffer
the_content
e reverte a substituição. Como isso:fonte