Evitar que Wordpress elimine las etiquetas <script> al cambiar de HTML a Visual (TinyMCE)
Bien, he visto soluciones que resuelven parcialmente este problema, pero nada definitivo y nada que solucione mi problema al 100%.
Escenario:
- En modo HTML, agrego código javascript a una entrada que estoy editando.
- Cambio al modo Visual, luego vuelvo a HTML, y la etiqueta script y todo su contenido desaparecen.
¿Cómo puedo evitar que esto suceda? He intentado agregar código personalizado en mi functions.php tratando de acceder a extended_valid_elements para TinyMCE, pero nada funciona.
¡Por favor ayuda!
Esto se puede hacer fácilmente otorgando la capacidad unfiltered_html
al rol que desees permitir el uso de etiquetas SCRIPT e IFRAME. Obviamente, como mencionaron otros, existen riesgos de seguridad inherentes, así que sé prudente al respecto.
Para aprender más sobre cómo otorgar capacidades, consulta la entrada del Codex de WordPress sobre add_cap().

Agregar JS directamente en el contenido es una muy, muy mala práctica, y es prácticamente invitar a ser hackeado.
Agrégalo mediante un shortcode, o si realmente es necesario, usa un campo personalizado (post meta/custom field) para almacenar el JS y mostrarlo después del contenido en tu plantilla usando echo get_post_meta($post->ID,'post_javascript',true );

Hola Tom, creo que sería muy útil si pudieras proporcionar evidencia de por qué esto es una mala práctica y por qué está pidiendo a gritos ser hackeado.

porque cualquiera puede insertar cualquier cosa en tu contenido, ya sea algo que haga que tus hipervínculos parpadeen o algo que realice una descarga automática. Cualquier persona con acceso a tu base de datos o con permisos de edición de publicaciones puede usar tu sitio para distribuir javascript malicioso

También mezcla contenido/datos con funcionalidad/controladores, y hace que tu contenido no sea portable entre temas, ya que cambiar de tema rompería el contenido.

ej. "¡Hola, este es mi primer post en el blog! <script>window.location="www.hackme.com/installtrojan";</script>"

Podría argumentar que "cualquiera con acceso a tu base de datos o con permisos de edición de posts" puede arruinarte el día de todas formas, e implementar esto mediante shortcodes o meta posts no haría diferencia en cuanto a seguridad. Igualmente, no veo que los shortcodes o meta posts separen contenido/datos de funcionalidad/controladores más de lo que @Buckers está preguntando. Creo que este es un buen valor por defecto para WordPress, no me malinterpretes, pero personalmente no veo ningún daño en anular este comportamiento con consentimiento informado, ni veo ventajas de seguridad u ortogonalidad en lo que propones. Pero, oye, tal vez me estoy perdiendo algo.

Con un shortcode no puedo simplemente insertar cualquier código JS antiguo, solo puedo insertar el JS que tú pretendes que inserte, ya que para añadir nuevo código JS necesitaría acceso a los archivos PHP que implementan ese shortcode. Por la misma razón que añadir PHP en el contenido del post es una práctica de seguridad atroz, pero eso no significa que no puedas usar PHP para implementar shortcodes (no estoy abogando en absoluto por la implementación de shortcodes [js][/js]
, esos también son malos)

Ah, lo siento, malinterpreté tu sugerencia. Ahora entiendo; estás hablando de usar shortcodes o post meta para recopilar parámetros, no JS en sí mismo, por ejemplo, especificar un ID, una URL de una imagen, lo que sea. Tienes razón, ¡la respuesta cambia radicalmente según lo que @Buckers esté buscando lograr!

He respondido a mi publicación inicial anterior con mi principal requisito para esto. Actualmente solo yo tengo acceso de administrador al sitio. Independientemente de las preocupaciones de seguridad, solo me gustaría saber si es posible hacer esto - lo cual, viendo esta respuesta, parece que podría ser.

Es posible, de la misma manera que hacer funcionar tu coche lanzándolo hacia adelante con explosiones desde la parte trasera lo es, o permitir que paquetes más grandes pasen por tu buzón quitando la puerta principal. Si estás buscando una manera fácil de insertar códigos de AdSense arbitrarios en el contenido, hay formas mucho mejores de hacerlo. Busca una solución a tu problema, no un parche para tu solución rota.

Sin necesidad de modificar el código PHP de las plantillas, puedes solucionar el problema mencionado por el OP, así como el problema de que en multisitio nadie más que el superadministrador tenga la capacidad unfiltered_html
mencionada por @Tom Auger, instalando el plugin "Shortcoder". Este plugin te permite crear "shortcodes personalizados" que simplemente renderizan algún texto. Esto puede ser cualquier cosa, incluyendo código Javascript.
Yo creo un "shortcode personalizado" para cada fragmento de código que necesito (generalmente uno para cada código personalizado distinto en una página) y así el editor visual reconoce el shortcode y no lo elimina.
También es genial para reutilizar código Javascript, si tienes múltiples páginas que necesitan el mismo (o similar) código.

suena muy inseguro en multisite (cualquier cosa que permita introducir HTML sin filtrar lo es) y en cualquier caso, parece que ya no tiene soporte por parte del autor

@MarkKaplun - No estoy seguro de por qué dices que el plugin no tiene soporte. No se ha actualizado recientemente, pero probablemente sea porque el autor está ocupado con otras cosas (puedes ver sus publicaciones en otros foros). De todos modos, funciona bien en la versión 4.7.

En cuanto al tema de seguridad - sigo viendo respuestas en este sitio que dicen "esto o aquello no es seguro, así que no lo hagas". Creo que quienes responden deberían dejar de imponer su modelo de seguridad a otros usuarios. Si un administrador decidió instalar un plugin y tenerlo disponible, asumiría que consideró las implicaciones de seguridad. En mi configuración de WPMS, todos los usuarios son de confianza (los creo manualmente), así que si elijo hacer disponible el plugin Shortcoder, es porque he revisado las consideraciones de seguridad y son aceptables. Esperaría que la mayoría de instalaciones WPMS estén en la misma categoría.

El 99.9% de los usuarios de WordPress no tienen ni idea de las implicaciones de seguridad de lo que están haciendo. Los usuarios nunca son de confianza, el problema es que solo lo descubrirás después de los hechos, cuando será extremadamente difícil recuperarse de ello.

En cuanto al plugin, si al autor no se molesta en actualizar el archivo readme para indicar que debería funcionar en una versión que se lanzó hace 3 meses, es un buen indicio de que perdió interés en el plugin.

Debido a que WPMS es tan difícil de instalar (necesitas editar archivos de configuración no triviales), tendería a argumentar que el nivel de los administradores de WPMS es algo más alto que el del editor promedio de WP. En el mejor de los casos, puedes explicar las implicaciones de seguridad (que por cierto, no has explicado por qué crees que shortcoder es un problema en multisitios). Respecto al tema de soporte - creo que tomar lo que dijiste como un indicio es un poco exagerado - personalmente doy soporte a un par de plugins de WordPress, normalmente no tengo tiempo para probarlos en la última versión de WordPress en cada lanzamiento, o a veces ni siquiera una vez al año.

y solo para que entiendas por qué los usuarios no son de confianza, incluso si los conoces personalmente... ¿Estás realmente seguro de que no usan "123456" como contraseña? ¿O que dejan que su sobrino use su computadora, etc.? No limitas a los usuarios porque puedan ser mala gente, los limitas para reducir los vectores de una brecha de seguridad que afectará a más que solo su cuenta

Continuemos esta discusión en el chat.

A partir de 2024, puedes permitir HTML sin filtrar en wp-config.php estableciendo DISALLOW_UNFILTERED_HTML en false de esta manera:
define( 'DISALLOW_UNFILTERED_HTML', false );
En cuanto a temas de seguridad: Habilitar HTML sin filtrar al establecer DISALLOW_UNFILTERED_HTML en false requiere confianza en tus administradores y conciencia de seguridad, ya que les permite insertar código potencialmente dañino. Sin embargo, si un hacker obtiene acceso a tu WordPress, las implicaciones de seguridad son graves independientemente de esta configuración.

También existe una solución para quienes tienen el plugin Elementor y no desean instalar complementos adicionales:
- Desde el menú de administración, ve a Plantillas > Añadir nueva
- Elige "Contenedor" como tipo de plantilla y asígnale un nombre adecuado para reconocer tu código más adelante en caso de necesitar ediciones.
- En la pantalla del editor de Elementor, haz clic en el signo + para añadir un contenedor y agrega un widget de código HTML dentro de él.
- Pega tu script dentro del cuadro HTML. (Nota: debe tener las etiquetas
<script></script>
alrededor del código) - Guarda y regresa a la lista de contenedores. (Plantillas > Plantillas guardadas > Contenedores)
- Localiza tu plantilla recién creada y copia su shortcode desde el cuadro que aparece frente a ella.
- Pega este shortcode en cualquier editor de texto y disfruta.
