web-dev-qa-db-fra.com

Extra TinyMCE éditeur bandes <p> et balises <br>?

Salut les gars, j'ai ajouté un TinyMCE à certaines zones de texte affichées dans une méta-boîte personnalisée. Toute la mise en forme fonctionne parfaitement, sauf que l'éditeur ne sauvegarde pas les balises <p> et <br/>. Cela ne préserve pas les sauts de ligne.

Le TinyMCE est configuré comme ceci:

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>';

Et que tout fonctionne parfaitement bien. Tous les boutons de formatage fonctionnent correctement, à l'exception des balises <P> et <BR>.

Je ne suis pas sûr que l'éditeur les supprime avant ou après l'enregistrement de la méta de publication.

Des idées?

22
Pippin

J'ai récemment eu ce travail. Vous devriez rechercher et remplacer metaname par votre nom de boîte méta.

La clé du maintien du formatage consistait à utiliser wpautop(); lors de la sauvegarde des données.

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));        
}
16
Arthur Carabott

Voici (une version allégée de) ce que j'utilise pour configurer TinyMCE de manière personnalisée:

// 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');

Je suppose que c'est ce que vous avez déjà essayé?

MODIFIER:

Vous devrez peut-être inclure d'autres modifications de configuration, telles que:

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

Jouez avec les paramètres de configuration TinyMCE et trouvez celui que vous devez modifier.

5
Chip Bennett

Cela semble avoir un peu changé dans les versions ultérieures de Wordpress. Vous pouvez maintenant désactiver cette fonctionnalité ainsi:

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

Vous avez peut-être trouvé une solution de contournement plus simple pour cela:

sur le modèle actuel, changez ceci:

<?php echo get_the_content());?>

pour ça:

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

De cette façon, wpautop () ajoute les balises supprimées par TinyMCE sur une base modèle par modèle.

3
patricksayshi

pourquoi ne pas utiliser wordpress nouvelle fonction wp_editor pour rendre le tinymce De cette façon, tout sera traité. Et lorsque vous montrez le contenu à l'utilisateur, appliquez le filtre the_content.

Comme ça:

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

Le filtre the_content convertira automatiquement les freins de liaison en <br> et <p>.

2
Sisir

c'est pour ceux qui utilisent les metabox pour wordpress: Nom du plugin: Meta Box Plugin URI: deluxeblogtips com/meta-box

j'ai modifié le /vendor/meta-box/inc/fields/wysiwyg.php en fonction statique:

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

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

- MAIS LA MEILLEURE SOLUTION IS -

Mettez ceci dans functions.php, il appelle le filtre à partir du pluggin 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
1
claudio

Une autre solution simple: utilisez les codes abrégés!

Placez ce code dans le fichier functions.php et utilisez [br] dans l'éditeur de contenu - HTML ou visuel - où vous voulez qu'une balise br apparaisse.

add_shortcode("br", "br_tag");

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

}
1
Tapefreak