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?

Pomme reinette
la source
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));        
}
Arthur Carabott
la source
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.

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

patricksayshi
la source
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>.

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

}
Tapefreak
la source
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
Claudio
la source
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