Como personalizar o TinyMCE4 no WP 3.9 - a maneira antiga de estilos e formatos não funciona mais


10

Antes do WP 3.9, eu tinha os dois filtros a seguir aplicados no 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');

para que a lista suspensa de formatos de parágrafo mostre apenas p, h3 e h4, enquanto a lista suspensa de estilos personalizados mostra "Cabeçalho bruto", "Cabeçalho Klein" e assim por diante. Mas, infelizmente, o wp e o tinymce não se incomodam mais desde o wp 3.9. Agora só vejo o formato padrão dos parágrafos suspenso

parágrafo

bem como o menu suspenso de estilos de estilos padrão:

estilos

Até agora, não encontrei nenhum documento sobre se algum gancho mudou com a atualização para tinymce 4. Alguém sabe? Atenciosamente Ralf

Atualização: Ok, com base em um pouco mais de pesquisa e nos comentários abaixo, acho que descobri as coisas:

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


Não, eu não vi. Obrigado! Infelizmente, porém, com o código descrito lá, só é possível criar um botão em vez de reformular o estilo e as listas suspensas de parágrafos. Tem que continuar lendo e pesquisando.
ermarus

Veja como você pode manter os itens de menu originais style_selecte adicionar um menu "Classes". wordpress.stackexchange.com/questions/143689/…
Howdy_McGee

Respostas:


19

Se você procurar, class-wp-editor.phpverá que o filtro que você está usando ainda está lá, no entanto, as configurações são diferentes.

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

Estou supondo, mas acho que você precisa alterar a chave da matriz para a qual está alvejando formats.

EDIT Deixando isso em vigor, mas o OP confirma que isso não faz o que ele está 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');

Lembre-se de que isso não é totalmente testado, portanto sua milhagem pode variar. (E não use em um site de produção até testá-lo).

Continuando em diante

Indo mais fundo, os formatos parecem ser um botão tinyMCE personalizado. Você pode ver que o formatselectbotão foi adicionado mce_buttons_2no class-wp-editor.php. E então eu rastreei isso para 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'
        );

Com isso em mente, acho que o novo destino seria 1. (idealmente) alterar o editor.settings.block_formatsou 2. remover esse botão filtrando mce_buttons_2e adicionando sua própria versão personalizada.

Testado e funcionando

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

Advertência pequena : não sei onde adicionar os estilos para os itens suspensos. No exemplo TinyMCE, a opção "Red Headline" é vermelha. Eu não conseguia descobrir isso. Se você fizer, por favor, conte para mim.


obrigado helga! Eu olhei para o editor de classe wp antes também. Mas não tinha certeza qual deveria ser a sintaxe (não há muita documentação relacionada ao wp para o tinymceapi atualizado). tentei sua sugestão agora. mesmos resultados, como nos meus snippets iniciais. O TinyMCE não se importa com a aparência do init. no site tinymce eu encontrei um exemplo para formatos personalizados, JS somente, e eu falhei para adaptá-lo para a wp e php: tinymce.com/tryit/custom_formats.php
ermarus

11
Grande ajuda, obrigado! Só queria acrescentar que a block_formatsopção não pode ter um final; . Eu estava criando o valor a partir de opções configuráveis ​​salvas e tinha um final; que borked a lista. Espero que isso salve alguém por alguns minutos.
Adam Pope

11
@indextwo sim, eu resolvi aqui (o melhor que pude) e decidi ... ei ... postagem no blog! Você não recebe a turma em um intervalo, mesmo se você a define como embutida? array( 'title' => 'Red text', 'inline' => 'span', 'styles' => array( 'color' => '#ff0000' ) ),?
22814 helgatheviking

2
Os itens no menu Formatar herdam os estilos do editor-styles.css, exceto os estilos de cores. Se você quiser que os estilos de cor, bem como, adicionando este código para a função mce_mod () trabalhou para mim:unset($init['preview_styles']);
Dalton

11
@helgatheviking em relação à sua pequena advertência : você pode ativar todos os estilos se definir $init['preview_styles'] = 'font-family font-size font-weight font-style text-decoration text-transform color background-color border border-radius outline text-shadow';. Eu acho que isso é essencialmente o mesmo que o @ Dalton sugeriu, embora de uma maneira mais explícita. Isso simplesmente define os valores padrão, como por tmce documentação
Robro
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.