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?

Reineta
fuente
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));        
}
Arthur Carabott
fuente
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.

Chip Bennett
fuente
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;
}
Nathan Crause
fuente
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.

patricksayshi
fuente
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>.

Sisir
fuente
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/>");                            

}
Tapefreak
fuente
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
claudio
fuente
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