El editor TinyMCE extra elimina las etiquetas <p> y <br>?

22 abr 2011, 18:25:16
Vistas: 25.7K
Votos: 23

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?

3
Comentarios

Logré hacer que funcione de una manera. Duplicando la función del núcleo y cambiando 'remove_linebreaks' => true por 'remove_linebreaks' => false. Pero no funciona si especifico 'remove_linebreaks' => false en el array de configuración pasado a la función

Pippin Pippin
22 abr 2011 22:29:18

Estamos viendo algo muy extraño. Las publicaciones que se ingresan manualmente o se copian y pegan conservan los saltos de línea al editar. Las publicaciones que importamos pierden los saltos de línea cuando se editan.

JCL1178 JCL1178
8 feb 2012 00:31:04

@Arthur Carabott sí, eso también funcionó para mí. Agreguemos un enlace a la documentación: http://codex.wordpress.org/Function_Reference/wpautop ¡Adiós!

Luca Reghellin Luca Reghellin
18 nov 2011 17:02:39
Todas las respuestas a la pregunta 7
1
16

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));        
}
23 may 2011 00:07:00
Comentarios

update_post_meta también ejecutará add_post_meta si el meta_key que se va a insertar no existe.

vmassuchetto vmassuchetto
9 dic 2011 15:26:14
0

Esto parece haber cambiado un poco en versiones posteriores de WordPress. Ahora puedes deshabilitar esta funcionalidad de la siguiente manera:

add_filter('tiny_mce_before_init', function($init) {
    $init['wpautop'] = false;
    return $init;
}
4 oct 2015 05:12:01
6

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.

26 abr 2011 20:28:06
Comentarios

No, no utilicé eso. ¿Cómo podría filtrar mi wp_tiny_mce con tu función?

Pippin Pippin
27 abr 2011 07:06:07

Coloca el código en functions.php.

Chip Bennett Chip Bennett
27 abr 2011 16:07:17

Hmmm, eso no está funcionando.

Pippin Pippin
27 abr 2011 17:04:53

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

Chip Bennett Chip Bennett
27 abr 2011 17:20:16

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?

Pippin Pippin
27 abr 2011 18:13:50

Ya debería estar enganchado, en tiny_mce_before_init. No lo tienes dentro de otra función, u objeto, etc., ¿verdad?

Chip Bennett Chip Bennett
27 abr 2011 18:19:30
Mostrar los 1 comentarios restantes
0

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.

8 mar 2013 17:09:17
1

¿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>.

21 ene 2012 22:44:40
Comentarios

En el momento en que se publicó esta pregunta, la función wp_editor() no estaba disponible.

Pippin Pippin
23 ene 2012 06:17:24
0

Otra solución sencilla: ¡Usar Shortcodes!

Coloca este código en functions.php y usa [br] en el editor de contenido - HTML o visual - donde quieras que aparezca una etiqueta br.

add_shortcode("br", "br_tag");

function br_tag(){
    return("<br/>");                            

}
31 ago 2012 00:11:59
3

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
6 nov 2013 13:42:43
Comentarios

Ahora ya no puedes actualizar el plugin. No es una buena solución.

fuxia fuxia
6 nov 2013 14:26:32

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

ClaudioC ClaudioC
6 nov 2013 19:15:06

¿Conectarse al hook save_post antes que el plugin y preparar el valor en una función separada?

fuxia fuxia
6 nov 2013 19:33:58