L'éditeur TinyMCE supplémentaire supprime les balises <p> et <br>?


22

Hé les gars, j'ai ajouté un TinyMCE à certaines zones de texte qui sont affichées dans une méta-boîte personnalisée. Tous le formatage fonctionne parfaitement bien, sauf que l'éditeur ne sauvera pas <p>ou les <br/>mots clés. Il 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 cela fonctionne parfaitement bien. Tous les boutons de mise en forme fonctionnent correctement, à l'exception des balises <P>et <BR>.

Je ne sais pas si l'éditeur les supprime avant ou après la sauvegarde de la méta post.

Des idées?


J'ai réussi à le faire fonctionner d'une manière. En dupliquant la fonction du noyau et en changeant 'remove_linebreaks' => trueen 'remove_linebreaks' => false. Mais cela ne fonctionne pas si je le spécifie 'remove_linebreaks' => falsedans le tableau des paramètres transmis à la fonction
Pippin

@Arthur Carabott oui, cela a aussi fait l'affaire pour moi. Ajoutons un lien vers les documents: codex.wordpress.org/Function_Reference/wpautop Bye!
Luca Reghellin

Nous voyons une chose très étrange. Les articles saisis / collés à la main ont les coupures préservées lors de la modification. Les messages que nous avons importés sont sujets à ce que l'éditeur supprime les sauts de ligne lors de la modification.
JCL1178

Réponses:


16

J'ai récemment obtenu ce travail. Vous devez rechercher et remplacer metanamepar le nom de votre méta-boîte.

La clé du maintien du formatage était l'utilisation wpautop();lors de l'enregistrement 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));        
}

update_post_metasera également add_post_metasi le meta_keyà insérer n'existe pas.
vmassuchetto

5

Voici (une version simplifiée de) ce que j'utilise pour configurer TinyMCE sur mesure:

// 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 de TinyMCE et trouvez celui que vous devez modifier.


Non, je ne l'ai pas utilisé. Comment filtrer mon wp_tiny_mce avec votre fonction?
Pippin

Déposez le code functions.php.
Chip Bennett

Hmmm, ça ne marche pas.
Pippin

Voir mon montage. Vous ne ciblez peut-être pas le paramètre de configuration correct.
Chip Bennett

1
Il devrait déjà être accroché tiny_mce_before_init. Vous ne l'avez pas dans une autre fonction, un autre objet, etc., n'est-ce pas?
Chip Bennett

5

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

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

3

Peut-être trouvé une solution de contournement plus simple pour cela:

sur le modèle réel, 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 modèle par modèle.


2

pourquoi ne pas utiliser la nouvelle fonction wordpress wp_editorpour rendre le tinymce. De cette façon, tout sera géré. 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_contentconvertira automatiquement les freins de liaison en <br>et <p>.


Au moment où cette question a été publiée, la fonction wp_editor () n'était pas disponible.
Pippin

1

Une autre solution simple: utilisez les Shortcodes!

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

add_shortcode("br", "br_tag");

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

}

1

c'est pour ceux qui utilisent les métaboxes pour wordpress: Nom du plugin: Meta Box URI du plugin: 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 EST -

Mettez ceci dans functions.php, il appelle le filtre depuis le 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

Maintenant, vous ne pouvez plus mettre à jour le plugin. Pas une bonne solution.
fuxia

Vous avez une opinion un peu plus constructive? :) Où puis-je mettre ce code sur functions.php?
claudio

Connectez-vous save_postplus tôt que le plugin et préparez la valeur dans une fonction distincte?
fuxia
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.