Jak dostosować TinyMCE4 w WP 3.9 - stary sposób na style i formaty już nie działa

10

Przed WP 3.9 miałem dwa następujące filtry zastosowane w functions.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');

więc menu rozwijane formatów akapitów pokazuje tylko p, h3 i h4, a menu rozwijane stylów niestandardowych pokazuje „Nagłówek brutto”, „Nagłówek klein” i tak dalej. Niestety, wp i tinymce nie przejmują się już od wp 3.9, teraz widzę tylko standardowe menu formatów akapitowych

ustęp

oraz menu rozwijane formatu standardowych stylów:

style

Do tej pory nie znalazłem żadnych dokumentów na temat tego, czy jakieś haki zmieniły się wraz z aktualizacją do tinymce 4. Czy ktoś wie? Z pozdrowieniami Ralf

Aktualizacja: Ok na podstawie trochę więcej badań i komentarzy poniżej, chyba wymyśliłem:

//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');
Ermus
źródło
Nie, nie widziałem. Dzięki! Niestety, przy pomocy opisanego kodu możliwe jest jedynie utworzenie przycisku zamiast zmiany stylów i rozwijanych akapitów. Muszę czytać i badać.
ermarus
Oto, w jaki sposób możesz zachować oryginalne elementy menu style_selecti dodać do niego menu „Klasy”. wordpress.stackexchange.com/questions/143689/…
Howdy_McGee

Odpowiedzi:

19

Jeśli zajrzysz do class-wp-editor.phpśrodka, zobaczysz, że filtr, którego używasz, nadal tam jest, ale ustawienia są różne.

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

Zgaduję, ale myślę, że musisz zmienić klucz tablicy, na który celujesz formats.

EDYCJA Pozostawiając to na swoim miejscu, ale OP potwierdza, że ​​nie robi tego, co próbuje.

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

Pamiętaj, że jest to całkowicie niesprawdzone, więc Twój przebieg może się różnić. (I nie używaj go na stronie produkcyjnej, dopóki go nie przetestujesz).

Kontynuacja

Głębsze kopanie formatów wydaje się być niestandardowym przyciskiem tinyMCE. Możesz zobaczyć, że formatselectprzycisk został dodany mce_buttons_2w class-wp-editor.php. A potem śledziłem to, aby 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'
        );

Mając to na uwadze, myślę, że nowym celem będzie 1. (najlepiej) zmiana editor.settings.block_formatslub 2. usunięcie tego przycisku poprzez filtrowanie mce_buttons_2i dodawanie własnej wersji niestandardowej.

Testowane i działające

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

Małe zastrzeżenie : Nie jestem pewien, gdzie dodać style dla samych rozwijanych elementów. W próbce TinyMCE opcja „Czerwony nagłówek” jest czerwona. Nie mogłem tego rozgryźć. Jeśli to zrobisz, daj mi znać.

helgatheviking
źródło
dzięki helga! też wcześniej zajrzałem do edytora klas-wp-editor. Ale nie był pewien, jaka powinna być składnia (nie ma wiele dokumentacji związanej z wp dla zaktualizowanego tinymceapi). wypróbowałem teraz twoją sugestię. takie same wyniki jak w przypadku moich początkowych fragmentów. TinyMCE nie ma nic przeciwko temu, jak wygląda init. na stronie tinymce znalazłem przykład niestandardowych formatów, tylko js, ​​i nie udało mi się dostosować go do wp i php: tinymce.com/tryit/custom_formats.php
ermarus
1
Świetna pomoc, dzięki! Chciałem tylko dodać, że block_formatsopcja nie może mieć końca; . Budowałem wartość z zapisanych konfigurowalnych opcji i miałem końcowy; to rozwaliło listę. Mam nadzieję, że kogoś to ocali.
Adam Pope
1
@indextwo tak, rozwiązałem to tutaj (najlepiej jak mogłem) i zdecydowałem ... hej ... post na blogu! Nie dostajesz klasy na rozpiętości, nawet jeśli zdefiniujesz ją jako wbudowaną? array( 'title' => 'Red text', 'inline' => 'span', 'styles' => array( 'color' => '#ff0000' ) ),?
helgatheviking
2
Elementy w menu formatowania dziedziczą style z Twojego edytora styles.css, z wyjątkiem stylów kolorów. Jeśli chcesz także stylów kolorów, dodanie tego kodu do funkcji mce_mod () zadziałało dla mnie:unset($init['preview_styles']);
Dalton
1
@helgatheviking w sprawie twojego małego zastrzeżenia : możesz włączyć wszystkie style, jeśli ustawisz $init['preview_styles'] = 'font-family font-size font-weight font-style text-decoration text-transform color background-color border border-radius outline text-shadow';. Wydaje mi się, że jest to zasadniczo to samo, co sugerował @Dalton, choć w bardziej wyraźny sposób. To po prostu ustawia wartości domyślne, zgodnie z dokumentacją
robro