如何在WP 3.9中自定义TinyMCE4-样式和格式的旧方法不再起作用


10

在WP 3.9之前,我在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');

因此,段落格式下拉列表仅显示p,h3和h4,而自定义样式下拉列表显示“ Header gross”,“ Header klein”等。但是不幸的是,wp和tinymce从wp 3.9开始就不再麻烦了,我现在仅看到标准段落格式的下拉列表

段

以及标准样式格式下拉列表:

样式

到目前为止,我还没有找到关于文档更新到tinymce 4时是否有任何钩子的文档。有人知道吗?最好的问候拉尔夫

更新:基于更多的研究和下面的评论,我想我已经知道了:

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


不,我没有看到。谢谢!但是不幸的是,在那里描述的代码只能创建一个按钮,而不是重塑样式和段落下拉列表。必须继续阅读和研究。
ermarus 2014年

这样可以保留原始菜单项,style_select并向其中添加“类”菜单。wordpress.stackexchange.com/questions/143689/...
Howdy_McGee

Answers:


19

如果您看一下,class-wp-editor.php会发现所使用的过滤器仍然存在,但是设置有所不同。

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

我正在猜测,但我认为您需要更改要定位到的数组键formats

编辑保留此位置,但OP确认此操作不执行他正在尝试的操作。

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

请记住,这是完全未经测试的,因此您的行驶里程可能会有所不同。(并且在测试之前,请勿在生产站点上使用)。

继续向前

深入研究格式似乎是自定义的tinyMCE按钮。您可以看到该formatselect按钮已添加到mce_buttons_2class-wp-editor.php。然后我跟踪到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'
        );

考虑到这一点,我认为新目标将是1.(理想情况下)更改editor.settings.block_formats或2.通过过滤mce_buttons_2并添加自己的自定义版本来删除该按钮。

经过测试和工作

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

小警告:我不确定在哪里为下拉菜单项添加样式。在TinyMCE示例中,“红色标题”选项为红色。我不知道这个。如果您愿意,请告诉我。


谢谢Helga!我也曾经研究过class-wp-editor。但是不确定语法必须是什么(更新的tinymceapi没有很多与wp相关的文档)。现在尝试了您的建议。与我最初的片段一样的结果。TinyMCE不介意初始化的样子。在tinymce网站上,我找到了仅用于自定义格式的示例,仅适用于js,但我未能使其针对wp和php进行调整:tinymce.com/tryit/custom_formats.php
ermarus 2014年

1
很大的帮助,谢谢!只是想补充一点,该block_formats选项不能有尾随;。我正在从保存的可配置选项中建立价值,并有一个尾随; 令名单无聊。希望能节省几分钟。
亚当·波普

1
@indextwo是的,我在这里(尽我所能)解决了这个问题,然后决定...嘿...博客文章!即使您将其定义为内联,也不会跨度获得该类?array( 'title' => 'Red text', 'inline' => 'span', 'styles' => array( 'color' => '#ff0000' ) ),
helgatheviking 2014年

2
格式菜单中的项目继承了您的editor-styles.css中的样式,颜色样式除外。如果您还想要颜色样式,请将此代码添加到mce_mod()函数对我有用:unset($init['preview_styles']);
Dalton

1
@helgatheviking关于您的小提示:您可以启用所有样式$init['preview_styles'] = 'font-family font-size font-weight font-style text-decoration text-transform color background-color border border-radius outline text-shadow';。我想这基本上与@Dalton建议的相同,尽管以更明确的方式。根据tmce文档
robro
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.