So passen Sie TinyMCE4 in WP 3.9 an - die alte Methode für Stile und Formate funktioniert nicht mehr

10

Vor WP 3.9 hatte ich die folgenden zwei Filter in der functions.php angewendet:

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

so dass das Dropdown-Menü für Absatzformate nur p, h3 und h4 anzeigt, während das Dropdown-Menü für benutzerdefinierte Stile "Header brutto", "Header klein" usw. anzeigt. Aber leider stören wp und tinymce seit wp 3.9 nicht mehr, ich sehe jetzt nur die Dropdown-Liste der Standard-Absatzformate

Absatz

sowie das Dropdown-Format für Standardformate:

Stile

Bisher habe ich keine Dokumente darüber gefunden, ob sich mit dem Update auf Tinymce 4 irgendwelche Hooks geändert haben. Weiß jemand Bescheid? Viele Grüße Ralf

Update: Ok, basierend auf etwas mehr Recherche und den Kommentaren unten, ich denke, ich habe die Dinge herausgefunden:

//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');
rpk
quelle
Nein, ich habe nicht gesehen. Vielen Dank! Leider ist es mit dem dort beschriebenen Code nur möglich, eine Schaltfläche zu erstellen, anstatt die Dropdown-Listen für Stil und Absätze neu zu gestalten. Ich muss weiter lesen und recherchieren.
RPK
Hier erfahren Sie, wie Sie die ursprünglichen Menüelemente beibehalten style_selectund ein Menü "Klassen" hinzufügen können. wordpress.stackexchange.com/questions/143689/…
Howdy_McGee

Antworten:

19

Wenn Sie nachsehen, werden class-wp-editor.phpSie feststellen, dass der von Ihnen verwendete Filter noch vorhanden ist, die Einstellungen jedoch unterschiedlich sind.

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

Ich vermute, aber ich denke, Sie müssen den Array-Schlüssel ändern, auf den Sie abzielen formats.

BEARBEITEN Belassen Sie dies an Ort und Stelle, aber das OP bestätigt, dass dies nicht das tut, was er versucht.

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

Denken Sie daran, dass dies völlig ungetestet ist, sodass Ihr Kilometerstand variieren kann. (Und nicht auf einer Produktionsstätte verwenden, bis Sie es getestet haben).

Weiter geht es

Wenn Sie tiefer in die Formate graben, scheinen Sie eine benutzerdefinierte tinyMCE-Schaltfläche zu sein. Sie können sehen, dass die formatselectSchaltfläche mce_buttons_2in der hinzugefügt wird class-wp-editor.php. Und dann verfolgte ich das zu 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'
        );

Vor diesem Hintergrund denke ich, dass das neue Ziel darin besteht, 1. (idealerweise) die editor.settings.block_formatsSchaltfläche oder 2. zu ändern, mce_buttons_2indem Sie diese Schaltfläche filtern und Ihre eigene benutzerdefinierte Version hinzufügen.

Getestet und funktionsfähig

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

Kleine Einschränkung : Ich bin nicht sicher, wo ich die Stile für die Dropdown-Elemente selbst hinzufügen soll. Im TinyMCE-Beispiel ist die Option "Rote Überschrift" rot. Ich konnte das nicht herausfinden. Wenn ja, lassen Sie es mich bitte wissen.

Helgatheviking
quelle
danke helga! Ich habe mir auch schon mal den Class-WP-Editor angesehen. War sich aber nicht sicher, wie die Syntax lauten musste (es gibt nicht viel wp-bezogene Dokumentation für das aktualisierte tinymceapi). habe jetzt deinen Vorschlag ausprobiert. gleiche Ergebnisse wie bei meinen ersten Schnipsel. TinyMCE macht es nichts aus, wie der Init aussieht. Auf der Tinymce-Website habe ich ein Beispiel für benutzerdefinierte Formate gefunden, nur js, und ich konnte es nicht an wp und php anpassen: tinymce.com/tryit/custom_formats.php
rpk
1
Tolle Hilfe, danke! Ich wollte nur hinzufügen, dass die block_formatsOption kein Trailing haben kann. . Ich habe den Wert aus gespeicherten konfigurierbaren Optionen erstellt und hatte ein Trailing. das hat die Liste verdorben. Hoffe das spart jemandem ein paar Minuten.
Adam Pope
1
@indextwo yup, ich habe es hier gelöst (so gut ich konnte) und beschlossen ... hey ... Blogpost! Sie erhalten die Klasse nicht in einer Zeitspanne, selbst wenn Sie sie als Inline definieren? array( 'title' => 'Red text', 'inline' => 'span', 'styles' => array( 'color' => '#ff0000' ) ),?
Helgatheviking
2
Die Elemente im Formatmenü erben die Stile von Ihrer editor-styles.css, mit Ausnahme der Farbstile . Wenn Sie auch die Farbstile möchten, hat das Hinzufügen dieses Codes zur Funktion mce_mod () für mich funktioniert:unset($init['preview_styles']);
Dalton
1
@helgatheviking bezüglich Ihrer kleinen Einschränkung : Sie können alle Stile aktivieren, wenn Sie festlegen $init['preview_styles'] = 'font-family font-size font-weight font-style text-decoration text-transform color background-color border border-radius outline text-shadow';. Ich denke, dies ist im Wesentlichen dasselbe wie von @Dalton vorgeschlagen, wenn auch expliziter. Dies setzt einfach die Standardwerte gemäß tmce Dokumentation
Robro