Evitar que el editor WYSIWYG de WordPress elimine los iframes
Tengo un blog donde necesito insertar iframes en las publicaciones por varias razones (¡no preguntes por qué, solo confía en mí!)
Cuando uso la vista "visual" para editar mis publicaciones, el WYSIWYG constantemente elimina mis iframes...
Sé que puedo mantener los iframes en la publicación si uso la vista "html" y solo visualizo/guardo desde la vista "html"... sin embargo, me gustaría realmente poder usar el WYSIWYG normal para editar mi publicación sin tener que recurrir a la vista "html".
¿Hay algo que pueda hacer para deshabilitar este comportamiento? He visto esta publicación, que sugiere editar wp-includes/js/tinymce/tiny_mce_config.php
, pero preferiría evitar hacer algo así que probablemente se rompa en una actualización!
Puedes personalizar el filtro de TinyMCE, mira el siguiente ejemplo para <iframe>
s y otras etiquetas para usar Google Maps dentro de TinyMCE.
function fb_change_mce_options( $initArray ) {
// Cadena separada por comas de etiquetas extendidas.
// Cadena separada por comas de elementos extendidos.
$ext = 'pre[id|name|class|style],iframe[align|longdesc|name|width|height|frameborder|scrolling|marginheight|marginwidth|src]';
if ( isset( $initArray['extended_valid_elements'] ) ) {
$ext = ',' . $ext;
}
$initArray['extended_valid_elements'] = $ext;
// Opcionalmente, establecer el parámetro tiny verify_html
//$initArray['verify_html'] = false;
return $initArray;
}
add_filter( 'tiny_mce_before_init', 'fb_change_mce_options' );
Añade esto a un plugin personalizado o al functions.php del tema. También puedes leer más información en mi post: http://wpengineer.com/1963/customize-wordpress-wysiwyg-editor/

@bueltge - Buena respuesta. Justo hoy estaba en tu sitio leyendo esa misma publicación. Sabes, la mayoría de los ejemplos en la web sobre TinyMCE no están en el contexto de WordPress y cuando están en el contexto de WordPress es significativamente más complicado. Claramente lo entiendes bien. Hay mucho más que podrías cubrir sobre TinyMCE; ¿has considerado hacer una serie de publicaciones en un blog sobre esto?

Si no deseas escribir tu propio código, existe un plugin que permite incrustar un <iframe>
:
Luego simplemente usa el shortcode de esta manera:
[iframe http://example.com 400 500]

Esto realmente aplica a mi pregunta, sin necesidad de "hackear". Aunque todavía necesito usar la vista HTML... Gracias.

El plugin en esta respuesta ya no está actualizado, pero este otro parece bueno en su lugar: https://wordpress.org/plugins/iframe/

En un entorno multisitio, todos los usuarios que no sean superadministradores reciben filtrado de HTML (debido a posibles vulnerabilidades de seguridad). Basándote en esto, puedes añadir la capacidad unfiltered_html a los editores.
/**
* Habilita la capacidad unfiltered_html para los Editores.
*
* @param array $caps Las capacidades del usuario.
* @param string $cap Nombre de la capacidad.
* @param int $user_id El ID del usuario.
* @return array $caps Las capacidades del usuario, con 'unfiltered_html' potencialmente añadida.
*/
function km_add_unfiltered_html_capability_to_editors( $caps, $cap, $user_id ) {
if ( 'unfiltered_html' === $cap && user_can( $user_id, 'editor' ) ) {
$caps = array( 'unfiltered_html' );
}
return $caps;
}
add_filter( 'map_meta_cap', 'km_add_unfiltered_html_capability_to_editors', 1, 3 );

Si no te gusta usar un plugin adicional para la solución de shortcode, puedes añadir algo como esto a tu tema, plugin o functions.php para agregarlo manualmente. Si es necesario, quizás debas añadir más claves al array de claves.
add_shortcode( 'iframe' , 'mycustom_shortcode_iframe' );
function mycustom_shortcode_iframe($args, $content) {
$keys = array("src", "width", "height", "scrolling", "marginwidth", "marginheight", "frameborder");
$arguments = mycustom_extract_shortcode_arguments($args, $keys);
return '<iframe ' . $arguments . '></iframe>';
}
function mycustom_extract_shortcode_arguments($args, $keys) {
$result = "";
foreach ($keys as $key) {
if (isset($args[$key])) {
$result .= $key . '="' . $args[$key] . '" ';
}
}
return $result;
}
Luego, en tu página de publicación, el uso sería así:
[iframe width="425" height="350" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="https://maps.google.de/maps?f=q&source=s_q&hl=de&geocode=&q=New+York+City,+New+York,+USA&aq=0&oq=new+york&sll=51.238455,6.81435&sspn=0.373151,1.056747&ie=UTF8&hq=&hnear=New+York+City,+New+York,+Vereinigte+Staaten&t=m&z=11&iwloc=A&output=embed"]

no está funcionando. solo está publicando el iframe como el mismo contenido

Descubrí que usar el plugin Fusion Editor para construir mis páginas en WordPress funciona bien.
Este video muestra cómo usar Fusion Builder (avanza hasta el minuto 4:15 para la parte sobre agregar contenedores, columnas, elementos y bloques de código): https://www.youtube.com/watch?v=UDyNsnB_COA
Hago clic para agregar un contenedor, luego hago clic en agregar elemento, y luego agrego un bloque de código en lugar de un bloque de texto (el bloque de texto eliminará un iframe, pero un bloque de código no). En mi bloque de código pego mi código iframe y publico. ¡Funciona genial y no tengo que modificar ningún archivo PHP!
