Tiras de editor TinyMCE adicionales <p> y etiquetas de <br>


22

Hola chicos, agregué un TinyMCE a algunas áreas de texto que se muestran en un cuadro de meta personalizado. Todo el formato funciona perfectamente bien, excepto que el editor no guardará <p>ni <br/>etiquetará. No conserva los saltos de línea.

El TinyMCE está configurado de esta manera:

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 bien. Todos los botones de formato funcionan bien, excepto las etiquetas <P>y <BR>.

No estoy seguro de si el editor los está eliminando antes o después de guardar la meta meta.

Ideas?


Me las arreglé para que funcione de una manera. Al duplicar la función desde el núcleo y cambiar 'remove_linebreaks' => truea 'remove_linebreaks' => false. Pero no funciona si especifico 'remove_linebreaks' => falseen la matriz de configuración pasada a la función
— Pippin

@ Arthur Carabott sí, eso también me funcionó. Agreguemos un enlace a los documentos: codex.wordpress.org/Function_Reference/wpautop Bye!
— Luca Reghellin

Estamos viendo una cosa muy rara. Las publicaciones que se ingresan a mano / se pegan con copia tienen los saltos preservados en la edición. Las publicaciones que importamos están sujetas a que el editor elimine los saltos de línea en la edición.
— JCL1178

Respuestas:


16

Recientemente conseguí esto funcionando. Debes buscar y reemplazar metanamecon el nombre de tu meta box.

La clave para mantener el formateo era 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;

    // Verify
     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]);

     // New, Update, and Delete
     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));        
}

update_post_metatambién add_post_metasi el meta_keyque se va a insertar no existe.
— vmassuchetto

5

Aquí está (una versión reducida de) lo que uso para configurar TinyMCE a medida:

// http://tinymce.moxiecode.com/wiki.php/Configuration
function cbnet_tinymce_config( $init ) {

    // Don't remove line breaks
    $init['remove_linebreaks'] = false; 

    // Pass $init back to WordPress
    return $init;
}
add_filter('tiny_mce_before_init', 'cbnet_tinymce_config');

¿Supongo que esto es lo que ya intentaste?

EDITAR:

Es posible que deba incluir algunos otros cambios de configuración, como:

// Convert newline characters to BR tags
$init['convert_newlines_to_brs'] = true; 
// Do not remove redundant BR tags
$init['remove_redundant_brs'] = false;

Juega con los parámetros de configuración de TinyMCE y encuentra el que necesitas cambiar.


No, no usé eso. ¿Cómo filtraría mi wp_tiny_mce con su función?
— Pippin

Suelta el código functions.php.
— Chip Bennett

Hmmm, eso no está funcionando.
— Pippin

Mira mi edición. Es posible que no esté apuntando al parámetro de configuración correcto.
— Chip Bennett

1
Ya debería engancharse, en tiny_mce_before_init. No lo tienes dentro de otra función u objeto, etc., ¿verdad?
— Chip Bennett

5

Esto parece haber cambiado un poco en las versiones posteriores de Wordpress. Ahora puede deshabilitar esta funcionalidad de esta manera:

add_filter('tiny_mce_before_init', function($init) {
    $init['wpautop'] = false;
    return $init;
}

3

Encontramos quizás una solución más simple para esto:

en la plantilla real, cambie esto:

<?php echo get_the_content());?>

a esto:

<?php echo wpautop(get_the_content());?>

De esta manera, wpautop () agrega las etiquetas eliminadas por TinyMCE plantilla por plantilla.


2

¿por qué no usas la nueva función de wordpress wp_editorpara representar el tinymce De esa manera todo se manejará. Y cuando muestra el contenido al usuario, aplique el filtro the_content.

Me gusta esto:

$meta = "content of the metabox";
echo apply_filters('the_content', $meta);

El filtro the_contentconvertirá automáticamente los frenos de enlace a <br>y <p>.


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

1

Otra solución simple: ¡Use Shortcodes!

Coloque este código en functions.php y use [br] en el editor de contenido, HTML o visual, donde quiera que aparezca una etiqueta br.

add_shortcode("br", "br_tag");

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

}

1

esto es para quienes usan los metaboxes para wordpress: Nombre del complemento: Meta Box Plugin URI: deluxeblogtips com / meta-box

He modificado el /vendor/meta-box/inc/fields/wysiwyg.php en función estática:

static function html( $html, $meta, $field )

//just after the else i have added :
$meta = html_entity_decode($meta); // 
//and solve the problem ;)

- PERO LA MEJOR SOLUCIÓN ES -

Ponga esto en functions.php, llama al filtro desde el complemento de metaboxes:

function meta_wysiwyg_antes_save($meta)
{   
    $meta = html_entity_decode($meta);
    return $meta;
}
add_filter("rwmb_(ID-OF-METABOX-FIELD)_meta", "meta_wysiwyg_antes_save"); //en meta-box.php 194

Ahora ya no puede actualizar el complemento. No es una buena solución.
— fuxia

¿Tienes alguna opinión un poco más constructiva? :) ¿Dónde puedo poner este código en functions.php?
— claudio

¿Enganchar save_postantes que el complemento y preparar el valor en una función separada?
— fuxia
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.