Come personalizzare TinyMCE4 in WP 3.9: il vecchio modo di stili e formati non funziona più


10

Prima del WP 3.9 avevo applicato i seguenti due filtri nel function.php:

function my_mce_buttons_2( $buttons ) {
    array_unshift( $buttons, 'styleselect' );
    return $buttons;
}
add_filter('mce_buttons_2', 'my_mce_buttons_2');

function mce_mod( $init ) {
    $init['theme_advanced_blockformats'] = 'p,h3,h4';
    $init['theme_advanced_styles'] = "Header gross=mus-bi news-single-bighead; Header klein=mus-bi news-single-smallhead; Link=news-single-link; List Items=news-single-list";
    return $init;
}
add_filter('tiny_mce_before_init', 'mce_mod');

in modo che il menu a discesa dei formati di paragrafo mostri solo p, h3 e h4 mentre il menu a discesa degli stili personalizzati mostra "Header gross", "Header klein" e così via. Ma purtroppo wp e tinymce non danno più fastidio dal wp 3.9, ora vedo solo i formati di paragrafo standard

paragrafo

così come il menu a discesa del formato degli stili standard:

stili

Finora non ho trovato alcun documento su se alcuni hook sono stati modificati con l'aggiornamento a Tinymce 4. Qualcuno lo sa? Con i migliori saluti Ralf

Aggiornamento: Ok sulla base di un po 'più di ricerca e dei commenti qui sotto credo che ho capito le cose:

//Creating the style selector stayed the same
function my_mce_buttons( $buttons ) {
   array_unshift( $buttons, 'styleselect' );
   return $buttons;
}
add_filter('mce_buttons', 'my_mce_buttons');

function mce_mod( $init ) {
   //theme_advanced_blockformats seems deprecated - instead the hook from Helgas post did the trick
   $init['block_formats'] = "Paragraph=p; Heading 3=h3; Heading 4=h4";

   //$init['style_formats']  doesn't work - instead you have to use tinymce style selectors
   $style_formats = array(
    array(
        'title' => 'Header 3',
        'classes' => 'mus-bi news-single-bighead'
    ),
    array(
        'title' => 'Header 4',
        'classes' => 'mus-bi news-single-smallhead'
    ),
    array(
        'title' => 'Link',
        'block' => 'a',
        'classes' => 'news-single-link',
        'wrapper' => true
    )
   );
   $init['style_formats'] = json_encode( $style_formats );
   return $init;
}
add_filter('tiny_mce_before_init', 'mce_mod');


No non l'ho visto. Grazie! Ma sfortunatamente con il codice qui descritto è possibile solo creare un pulsante invece di rimodellare lo stile e i menu a discesa. Devo continuare a leggere e fare ricerche.
Erzegovina

Ecco come è possibile mantenere le voci di menu originali style_selecte aggiungere un menu "Classi". wordpress.stackexchange.com/questions/143689/…
Howdy_McGee

Risposte:


19

Se guardi dentro class-wp-editor.phptroverai che il filtro che stai usando è ancora lì, tuttavia le impostazioni sono diverse.

self::$first_init = array(
                    'theme' => 'modern',
                    'skin' => 'lightgray',
                    'language' => self::$mce_locale,
                    'formats' => "{
                        alignleft: [
                            {selector: 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles: {textAlign:'left'}},
                            {selector: 'img,table,dl.wp-caption', classes: 'alignleft'}
                        ],
                        aligncenter: [
                            {selector: 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles: {textAlign:'center'}},
                            {selector: 'img,table,dl.wp-caption', classes: 'aligncenter'}
                        ],
                        alignright: [
                            {selector: 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles: {textAlign:'right'}},
                            {selector: 'img,table,dl.wp-caption', classes: 'alignright'}
                        ],
                        strikethrough: {inline: 'del'}
                    }",
                    'relative_urls' => false,
                    'remove_script_host' => false,
                    'convert_urls' => false,
                    'browser_spellcheck' => true,
                    'fix_list_elements' => true,
                    'entities' => '38,amp,60,lt,62,gt',
                    'entity_encoding' => 'raw',
                    'keep_styles' => false,
                    'paste_webkit_styles' => 'font-weight font-style color',

                    // Limit the preview styles in the menu/toolbar
                    'preview_styles' => 'font-family font-size font-weight font-style text-decoration text-transform',

                    'wpeditimage_disable_captions' => $no_captions,
                    'wpeditimage_html5_captions' => current_theme_supports( 'html5', 'caption' ),
                    'plugins' => implode( ',', $plugins ),
                );

Sto indovinando, ma penso che tu debba cambiare la chiave dell'array a cui ti rivolgi formats.

MODIFICA Lasciare questo, ma il PO conferma che ciò non fa ciò che sta tentando.

function mce_mod( $init ) {
        $init['formats'] = "{
                            alignleft: [
                                {selector: 'p,h3,h4,td,th,div,ul,ol,li', styles: {textAlign:'left'}},
                                {selector: 'img,table,dl.wp-caption', classes: 'alignleft'}
                            ],
                            aligncenter: [
                                {selector: 'p,h3,h4,td,th,div,ul,ol,li', styles: {textAlign:'center'}},
                                {selector: 'img,table,dl.wp-caption', classes: 'aligncenter'}
                            ],
                            alignright: [
                                {selector: 'p,h3,h4,td,th,div,ul,ol,li', styles: {textAlign:'right'}},
                                {selector: 'img,table,dl.wp-caption', classes: 'alignright'}
                            ],
                            strikethrough: {inline: 'del'}
                        }";
    return $init;
}
add_filter('tiny_mce_before_init', 'mce_mod');

Tieni presente che questo è totalmente non testato, quindi il tuo chilometraggio può variare. (E non utilizzare su un sito di produzione fino a quando non lo hai testato).

Continuando

Scavando più a fondo i formati sembrano essere un pulsante tinyMCE personalizzato. Puoi vedere che il formatselectpulsante è stato aggiunto mce_buttons_2in class-wp-editor.php. E poi l'ho seguito per tinymce.js:

    editor.addButton('formatselect', function() {
        var items = [], blocks = createFormats(editor.settings.block_formats ||
            'Paragraph=p;' +
            'Address=address;' +
            'Pre=pre;' +
            'Heading 1=h1;' +
            'Heading 2=h2;' +
            'Heading 3=h3;' +
            'Heading 4=h4;' +
            'Heading 5=h5;' +
            'Heading 6=h6'
        );

Con questo in mente, penso che il nuovo obiettivo sarebbe di 1. (idealmente) cambiare il editor.settings.block_formatso 2. rimuovere quel pulsante filtrando mce_buttons_2e aggiungendo la tua versione personalizzata.

Testato e funzionante

function mce_mod( $init ) {
    $init['block_formats'] = 'Paragraph=p;Heading 3=h3;Heading 4=h4';

    $style_formats = array (
        array( 'title' => 'Bold text', 'inline' => 'b' ),
        array( 'title' => 'Red text', 'inline' => 'span', 'styles' => array( 'color' => '#ff0000' ) ),
        array( 'title' => 'Red header', 'block' => 'h1', 'styles' => array( 'color' => '#ff0000' ) ),
        array( 'title' => 'Example 1', 'inline' => 'span', 'classes' => 'example1' ),
        array( 'title' => 'Example 2', 'inline' => 'span', 'classes' => 'example2' )
    );

    $init['style_formats'] = json_encode( $style_formats );

    $init['style_formats_merge'] = false;
    return $init;
}
add_filter('tiny_mce_before_init', 'mce_mod');

function mce_add_buttons( $buttons ){
    array_splice( $buttons, 1, 0, 'styleselect' );
    return $buttons;
}
add_filter( 'mce_buttons_2', 'mce_add_buttons' );

Piccolo avvertimento : non sono sicuro di dove aggiungere gli stili per gli elementi a discesa stessi. Nell'esempio TinyMCE, l'opzione "Titolo rosso" è rossa. Non sono riuscito a capirlo. Se lo fai, per favore fatemi sapere.


grazie helga! ho già esaminato l'editor di classe wp prima. Ma non ero sicuro di quale dovesse essere la sintassi (non c'è molta documentazione relativa al wp per il tinymceapi aggiornato). ho provato il tuo suggerimento ora. stessi risultati come con i miei frammenti iniziali. A TinyMCE non importa come appare l'init. sul sito tinymce ho trovato un esempio di formati personalizzati, solo js, ​​e non sono riuscito ad adattarlo a wp e php: tinymce.com/tryit/custom_formats.php
ermarus

1
Un grande aiuto, grazie! Volevo solo aggiungere che l' block_formatsopzione non può avere un finale; . Stavo costruendo il valore dalle opzioni configurabili salvate e avevo un finale; che ha arricchito l'elenco. Spero che salvi qualcuno qualche minuto.
Adam Pope,

1
@indextwo yup, l'ho risolto qui (il meglio che potevo) e ho deciso ... ehi ... post sul blog! Non ottieni la lezione in un intervallo anche se la definisci come in linea? array( 'title' => 'Red text', 'inline' => 'span', 'styles' => array( 'color' => '#ff0000' ) ),?
Helgatheviking

2
Le voci nel menu del formato ereditano gli stili dal tuo editor-styles.css, ad eccezione degli stili di colore. Se vuoi anche gli stili di colore, aggiungere questo codice alla funzione mce_mod () ha funzionato per me:unset($init['preview_styles']);
Dalton

1
@helgatheviking per quanto riguarda il tuo piccolo avvertimento : puoi impostare tutti gli stili se impostato $init['preview_styles'] = 'font-family font-size font-weight font-style text-decoration text-transform color background-color border border-radius outline text-shadow';. Immagino che questo sia essenzialmente lo stesso suggerito da @Dalton, anche se in modo più esplicito. Questo semplicemente imposta i valori predefiniti, come da documentazione
tmce
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.