El editor TinyMCE extra elimina las etiquetas <p> y <br>?
Hola, he añadido TinyMCE a algunos campos textarea que se muestran en un metabox personalizado. Todo el formato funciona perfectamente, excepto que el editor no guarda las etiquetas <p>
o <br/>
. No preserva los saltos de línea.
El TinyMCE está configurado así:
wp_tiny_mce(true, array('editor_selector' => $field['class'] ) );
'<textarea name="', $field['id'], '" class="', $field['class'], '" id="', $field['id'], '" cols="60" rows="8" style="width:97%">', $meta ? esc_html($meta) : $field['std'], '</textarea>';
Y todo eso funciona perfectamente. Todos los botones de formato funcionan bien, excepto las etiquetas <P>
y <BR>
.
No estoy seguro si el editor las está eliminando antes o después de que se guarde el post meta.
¿Ideas?

Recientemente logré que esto funcionara. Debes buscar y reemplazar metaname
con el nombre de tu meta box.
La clave para mantener el formato fue usar wpautop();
al guardar los datos.
add_action( 'add_meta_boxes', 'add_metaname_box');
add_action( 'save_post', 'metaname_save');
function add_metaname_box() {
add_meta_box(
'metaname_id',
__( 'metaname text', 'metaname_textdomain'),
'metaname_custom_box',
'page'
);
}
function metaname_custom_box() {
global $post;
wp_nonce_field( plugin_basename( __FILE__ ), 'metaname_noncename' );
$data = get_post_meta($post->ID, 'metaname_custom_box', true);
echo <<<EOT
<script type="text/javascript">
jQuery(document).ready(function() {
jQuery("#metaname_custom_box").addClass("mceEditor");
if ( typeof( tinyMCE ) == "object" &&
typeof( tinyMCE.execCommand ) == "function" ) {
tinyMCE.execCommand("mceAddControl", false, "metaname_custom_box");
}
});
</script>
<textarea id="metaname_custom_box" name="metaname_custom_box">$data</textarea>
EOT;
}
function metaname_save($post_id) {
global $post;
// Verificar
if ( !wp_verify_nonce( $_POST['metaname_noncename'], plugin_basename(__FILE__) )) {
return $post_id;
}
if ( 'page' == $_POST['post_type'] ) {
if ( !current_user_can( 'edit_page', $post_id ))
return $post_id;
} else {
if ( !current_user_can( 'edit_post', $post_id ))
return $post_id;
}
$key = 'metaname_custom_box';
$data = wpautop($_POST[$key]);
// Nuevo, Actualizar y Eliminar
if(get_post_meta($post_id, $key) == "")
add_post_meta($post_id, $key, $data, true);
elseif($data != get_post_meta($post_id, $key, true))
update_post_meta($post_id, $key, $data);
elseif($data == "")
delete_post_meta($post_id, $key, get_post_meta($post_id, $key, true));
}

Aquí está (una versión simplificada de) lo que uso para configurar TinyMCE de forma personalizada:
// http://tinymce.moxiecode.com/wiki.php/Configuration
function cbnet_tinymce_config( $init ) {
// No eliminar saltos de línea
$init['remove_linebreaks'] = false;
// Devolver $init a WordPress
return $init;
}
add_filter('tiny_mce_before_init', 'cbnet_tinymce_config');
¿Supongo que esto es lo que ya intentaste?
EDITADO:
Puede que necesites incluir algunos otros cambios de configuración, como:
// Convertir caracteres de nueva línea a etiquetas BR
$init['convert_newlines_to_brs'] = true;
// No eliminar etiquetas BR redundantes
$init['remove_redundant_brs'] = false;
Experimenta con los parámetros de configuración de TinyMCE y encuentra el que necesitas cambiar.

Mira mi edición. Puede que no estés apuntando al parámetro de configuración correcto.

Hmm, todavía no funciona. Por lo que puedo ver, el filtro no está teniendo ningún efecto. Esto es para un plugin, así que el código del filtro está en el archivo principal del plugin. ¿Podría necesitar pasarse a través de un hook init?

Encontré quizás una solución más sencilla para esto:
En la plantilla actual, cambia esto:
<?php echo get_the_content());?>
por esto:
<?php echo wpautop(get_the_content());?>
De esta manera, wpautop() agrega las etiquetas que TinyMCE elimina, pero lo hace plantilla por plantilla.

¿Por qué no usas la nueva función de WordPress wp_editor
para renderizar el TinyMCE? De esa manera todo se manejará automáticamente. Y cuando muestres el contenido al usuario, aplica el filtro the_content
.
Así:
$meta = "contenido del metabox";
echo apply_filters('the_content', $meta);
El filtro the_content
convertirá automáticamente los saltos de línea en <br>
y <p>
.

esto es para quienes usan las metaboxes en WordPress: Plugin Name: Meta Box Plugin URI: deluxeblogtips com/meta-box
he modificado el archivo /vendor/meta-box/inc/fields/wysiwyg.php en la función estática:
static function html( $html, $meta, $field )
//justo después del else he añadido:
$meta = html_entity_decode($meta); //
//y resuelve el problema ;)
-- PERO LA MEJOR SOLUCIÓN ES --
Coloca esto en functions.php, llama al filtro del plugin metaboxes:
function meta_wysiwyg_antes_save($meta)
{
$meta = html_entity_decode($meta);
return $meta;
}
add_filter("rwmb_(ID-DEL-CAMPO-METABOX)_meta", "meta_wysiwyg_antes_save"); //en meta-box.php 194

¿Alguien tiene una opinión un poco más constructiva? :) ¿Dónde puedo poner este código en functions.php?
