L'editor TinyMCE aggiuntivo rimuove i tag <p> e <br>?

22 apr 2011, 18:25:16
Visualizzazioni: 25.7K
Voti: 23

Ciao a tutti, ho aggiunto TinyMCE ad alcune aree di testo che vengono visualizzate in un meta box personalizzato. Tutta la formattazione funziona perfettamente, eccetto che l'editor non salva i tag <p> o <br/>. Non mantiene le interruzioni di riga.

TinyMCE è configurato in questo modo:

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

E tutto questo funziona perfettamente. Tutti i pulsanti di formattazione funzionano bene, tranne i tag <P> e <BR>.

Non sono sicuro se l'editor li stia rimuovendo prima o dopo il salvataggio del post meta.

Idee?

3
Commenti

Sono riuscito a farlo funzionare in un modo. Duplicando la funzione dal core e cambiando 'remove_linebreaks' => true in 'remove_linebreaks' => false. Ma non funziona se specifico 'remove_linebreaks' => false nell'array delle impostazioni passato alla funzione

Pippin Pippin
22 apr 2011 22:29:18

Stiamo osservando una cosa molto strana. I post inseriti manualmente/copia-incollati mantengono le interruzioni di riga durante la modifica. I post che abbiamo importato subiscono la rimozione delle interruzioni di riga da parte dell'editor durante la modifica.

JCL1178 JCL1178
8 feb 2012 00:31:04

@Arthur Carabott sì, anche a me ha funzionato. Aggiungiamo un link alla documentazione: http://codex.wordpress.org/Function_Reference/wpautop Ciao!

Luca Reghellin Luca Reghellin
18 nov 2011 17:02:39
Tutte le risposte alla domanda 7
1
16

Recentemente ho fatto funzionare questo codice. Dovresti cercare e sostituire metaname con il nome della tua meta box.

La chiave per mantenere la formattazione è stata utilizzare wpautop(); durante il salvataggio dei dati.

add_action( 'add_meta_boxes', 'add_metaname_box');

add_action( 'save_post', 'metaname_save');

function add_metaname_box() {
    add_meta_box(
        'metaname_id',
        __( 'Testo metaname', '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;

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

     // Aggiungi, Aggiorna o Elimina
     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));        
}
23 mag 2011 00:07:00
Commenti

update_post_meta aggiungerà anche add_post_meta se la meta_key da inserire non esiste.

vmassuchetto vmassuchetto
9 dic 2011 15:26:14
0

Sembra che questo sia cambiato leggermente nelle versioni successive di WordPress. Ora puoi disabilitare questa funzionalità in questo modo:

add_filter('tiny_mce_before_init', function($init) {
    $init['wpautop'] = false;
    return $init;
}
4 ott 2015 05:12:01
6

Ecco (una versione semplificata di) ciò che utilizzo per configurare TinyMCE in modo personalizzato:

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

    // Non rimuovere gli interruzioni di riga
    $init['remove_linebreaks'] = false; 

    // Restituisci $init a WordPress
    return $init;
}
add_filter('tiny_mce_before_init', 'cbnet_tinymce_config');

Presumo che questo sia ciò che hai già provato?

MODIFICA:

Potresti aver bisogno di includere alcune altre modifiche alla configurazione, come:

// Converti i caratteri di nuova riga in tag BR
$init['convert_newlines_to_brs'] = true; 
// Non rimuovere i tag BR ridondanti
$init['remove_redundant_brs'] = false;

Sperimenta con i parametri di configurazione di TinyMCE e trova quello che devi modificare.

26 apr 2011 20:28:06
Commenti

No, non l'ho usato. Come potrei filtrare il mio wp_tiny_mce con la tua funzione?

Pippin Pippin
27 apr 2011 07:06:07

Inserisci il codice in functions.php.

Chip Bennett Chip Bennett
27 apr 2011 16:07:17

Hmmm, non funziona.

Pippin Pippin
27 apr 2011 17:04:53

Vedi la mia modifica. Potresti non aver individuato il parametro di configurazione corretto.

Chip Bennett Chip Bennett
27 apr 2011 17:20:16

Hmm, ancora nessun risultato. Per quanto ne so, il filtro non sta avendo alcun effetto. Questo è per un plugin, quindi il codice del filtro è posizionato nel file principale del plugin. Potrebbe essere necessario passarlo attraverso un hook init?

Pippin Pippin
27 apr 2011 18:13:50

Dovrebbe già essere agganciato, in tiny_mce_before_init. Non lo hai messo dentro un'altra funzione, o oggetto, ecc., vero?

Chip Bennett Chip Bennett
27 apr 2011 18:19:30
Mostra i restanti 1 commenti
0

Trovato forse una soluzione alternativa più semplice per questo:

sul template effettivo, cambia questo:

<?php echo get_the_content());?>

con questo:

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

In questo modo wpautop() aggiunge i tag rimossi da TinyMCE su base template per template.

8 mar 2013 17:09:17
1

perché non usi la nuova funzione di WordPress wp_editor per renderizzare il tinymce. In questo modo tutto verrà gestito automaticamente. E quando mostri il contenuto all'utente applica il filtro the_content.

In questo modo:

$meta = "contenuto della metabox";
echo apply_filters('the_content', $meta);

Il filtro the_content convertirà automaticamente gli a capo in <br> e <p>.

21 gen 2012 22:44:40
Commenti

Al momento in cui questa domanda è stata posta, la funzione wp_editor() non era disponibile.

Pippin Pippin
23 gen 2012 06:17:24
0

Un'altra semplice soluzione: Utilizza gli Shortcode!

Inserisci questo codice nel file functions.php e usa [br] nell'editor dei contenuti - HTML o visuale - dove vuoi che appaia un tag br.

add_shortcode("br", "br_tag");

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

}
31 ago 2012 00:11:59
3

Questo è per chi utilizza le metabox per WordPress:
Plugin Name: Meta Box
Plugin URI: deluxeblogtips com/meta-box

Ho modificato il file /vendor/meta-box/inc/fields/wysiwyg.php
nella funzione statica:

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

// subito dopo l'else ho aggiunto:
$meta = html_entity_decode($meta); // 
// e risolto il problema ;)

-- MA LA SOLUZIONE MIGLIORE È --

Aggiungi questo nel functions.php, richiama il filtro dal plugin metabox:

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"); //in meta-box.php 194
6 nov 2013 13:42:43
Commenti

Ora non puoi più aggiornare il plugin. Non è una buona soluzione.

fuxia fuxia
6 nov 2013 14:26:32

Qualcuno ha un'opinione un po' più costruttiva? :) Dove posso inserire questo codice nel functions.php?

ClaudioC ClaudioC
6 nov 2013 19:15:06

Agganciarsi a save_post prima del plugin e preparare il valore in una funzione separata?

fuxia fuxia
6 nov 2013 19:33:58