Posso aggiungere un formato personalizzato alle opzioni di formato nel pannello di testo?
Nell'editor di testo, dove è possibile impostare titoli e altre impostazioni, è possibile aggiungere i propri stili per l'utilizzo da parte dei clienti? E anche rimuovere quelli non necessari?

L'editor "classico" di TinyMCE ha due menu a discesa: formatselect
per stili di paragrafo e styleselect
per stili di carattere - che può anche contenere stili di paragrafo, rendendo il tutto più confuso. La configurazione in WordPress di default mostra solo il menu a discesa format. Se applichi un foglio di stile personalizzato all'editor, TinyMCE può utilizzarlo per rilevare i nomi delle classi e aggiungerli al menu a discesa style - ma questo non ha sempre funzionato per me.
Dalla versione 3.0 puoi chiamare add_editor_style()
nel tuo functions.php
per aggiungere un foglio di stile all'editor. Di default è editor-style.css
nella directory del tuo tema. Prima della 3.0 devi agganciarti al filtro mce_css
per aggiungere l'URL del tuo foglio di stile dell'editor. Questo finirà in il valore di configurazione content_css
di TinyMCE.
Per aggiungere il menu a discesa style, l'opzione styleselect
deve apparire in uno degli array di configurazione della barra dei pulsanti (theme_advanced_buttons[1-4]
in TinyMCE, filtrati da mce_buttons_[1-4]
in WordPress). La lista dei formati di blocco è controllata da l'opzione theme_advanced_blockformats
di TinyMCE, che puoi aggiungere all'array di controllo nel filtro tiny_mce_before_init
. Se vuoi personalizzare i nomi del menu a discesa style (non solo i nomi delle tue classi CSS), guarda l'opzione theme_advanced_styles
. Puoi anche usare l'opzione più avanzata style_formats
che ti dà maggiore flessibilità nel definire gli stili.
Il codice PHP rilevante con tutti gli hook e la configurazione di default si trova in wp-admin/includes/post.php
, nella funzione wp_tiny_mce()
. Mettendo tutto insieme, la tua configurazione potrebbe assomigliare a questa:
add_action( 'after_setup_theme', 'wpse3882_after_setup_theme' );
function wpse3882_after_setup_theme()
{
add_editor_style();
}
add_filter('mce_buttons_2', 'wpse3882_mce_buttons_2');
function wpse3882_mce_buttons_2($buttons)
{
array_unshift($buttons, 'styleselect');
return $buttons;
}
add_filter('tiny_mce_before_init', 'wpse3882_tiny_mce_before_init');
function wpse3882_tiny_mce_before_init($settings)
{
$settings['theme_advanced_blockformats'] = 'p,h1,h2,h3,h4';
// Da http://tinymce.moxiecode.com/examples/example_24.php
$style_formats = array(
array('title' => 'Testo grassetto', 'inline' => 'b'),
array('title' => 'Testo rosso', 'inline' => 'span', 'styles' => array('color' => '#ff0000')),
array('title' => 'Intestazione rossa', 'block' => 'h1', 'styles' => array('color' => '#ff0000')),
array('title' => 'Esempio 1', 'inline' => 'span', 'classes' => 'example1'),
array('title' => 'Esempio 2', 'inline' => 'span', 'classes' => 'example2'),
array('title' => 'Stili tabella'),
array('title' => 'Riga tabella 1', 'selector' => 'tr', 'classes' => 'tablerow1'),
);
// Prima della 3.1 serviva un trucco speciale per inviare questo array alla configurazione.
// Vedi la cronologia di questo post per le versioni precedenti.
$settings['style_formats'] = json_encode( $style_formats );
return $settings;
}

esiste un formato specifico che il file .css dovrebbe seguire quando si usa add_editor_style? non sembra succedere nulla

Ancora nessun successo nel capire come aggiungere classi al menu a tendina dei formati oltre a quelle predefinite.

@Mild Fuzz: La mia precedente risposta era fuorviante perché WordPress mostra solo uno dei due menu a tendina necessari. Ho aggiornato la mia risposta con un modo per aggiungere il secondo menu e come controllarlo.

Sei un mito!! Non sono sicuro di cosa faccia 'style_formats', ma 'theme_advanced_styles' fa esattamente quello che mi serve!!

Sto davvero cercando di far funzionare quel secondo blocco, perché sembrerebbe estremamente utile. Il problema è che $settings['style_formats'] è null prima di impostarlo, quindi non posso confrontare i formati con nulla.

@Mild Fuzz: I parametri per i diversi elementi di style_formats
sono spiegati nella pagina wiki correlata formats
.

che mostra tutto in JS, sono un po' confuso su come convertirlo in PHP funzionante. Ho provato '$settings['style_formats'] .= "custom_format : {block : 'h1', attributes : {title : \"Header\"}, styles : {color : red}}";' ma distrugge completamente tinyMCE

@Mild Fuzz: Pensavo che WordPress applicasse json_encode()
alla configurazione, ma invece la stampa semplicemente. Ho modificato la mia risposta per includere un po' di "iniezione JS" per passare una configurazione array a TinyMCE. Non garantisco che funzioni.

Il codice di esempio funziona e ha risolto la tua domanda? Nota che hai un errore di battitura alla fine della riga "Table styles", serve una ) e non una }

json_encode genera " e non ' quindi il javascript si interrompe. Devi fare str_replace('"', "'", json_encode($style_formats))

Puoi aggiungere un formato personalizzato o rimuoverne uno esistente in questo modo:
add_filter('tiny_mce_before_init', function($init_array) {
$init_array['formats'] = json_encode([
// aggiunge un nuovo formato ai formati esistenti
'h3marked' => [
'selector' => 'h3',
'block' => 'h3',
'classes' => 'article-paragraph',
],
], JSON_THROW_ON_ERROR);
// rimuove da questo array i formati non necessari
$block_formats = [
'Paragrafo=p',
'Titolo 1=h1',
'Titolo 2=h2',
'Titolo 3=h3',
'Titolo 3 evidenziato=h3marked', // utilizza il nuovo formato nel selettore
'Titolo 4=h4',
'Titolo 5=h5',
'Titolo 6=h6',
'Preformattato=pre',
];
$init_array['block_formats'] = implode(';', $block_formats);
return $init_array;
});
Vedi di più in questo articolo e nella documentazione di tinymce

Come indicato qui Il menu a discesa dei formati TinyMCE non mostra più l'anteprima degli stili
Kara aveva ragione, è necessario rimuovere gli stili predefiniti per vedere i nuovi stili...
unset($init['preview_styles']);
return $settings;
