L'editor TinyMCE aggiuntivo rimuove i tag <p> e <br>?
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?

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));
}

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.

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

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

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?

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.

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

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

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