问题描述

我熟悉创建 self-closing 短码,如:

// shortcode
function wpse_shortcode_example( $wpse_atts ) {

    // Attributes
    $wpse_atts = shortcode_atts(
        array(
            'foo' => 'bar',
            'width' => '100%',
            'height' => 'auto',
        ),
        $wpse_atts,
        'wpse'
    );

    // Return
    return '<embed
             src="'%20.%20$wpse_atts['src']%20.%20'"
             width="' . $wpse_atts['width'] . '"
             height="' . $wpse_atts['height'] . '";

}
add_shortcode( 'wpse', 'wpse_shortcode_example' );

但是我想开始将它们添加到 TinyMCE 中。我做了几次搜索,但所有的搜索结果都是过时的或使用不再推荐的方法:

我知道开发人员还处于早期阶段,但是插件手册只是简单地谈论 TinyMCE Enhanced ShortcodesShortcode API,而 add_shortcode()没有提到 TinyMCE 。

所以这就导致我的问题。在 TinyMCE 编辑器中将 self-closing 短码转换为可点击按钮的基本步骤是什么?

最佳解决方案

我们首先添加自定义 TinyMCE 按钮:

function add_mce_button_custom_em() {
    // check user permissions
    if ( !current_user_can( 'edit_posts' ) && !current_user_can( 'edit_pages' ) ) {
        return;
    }
    // check if WYSIWYG is enabled
    if ( 'true' == get_user_option( 'rich_editing' ) ) {
        add_filter( 'mce_external_plugins', 'add_tinymce_plugin_custom_em' );
        add_filter( 'mce_buttons', 'register_mce_button_custom_em' );
    }
}
add_action('admin_head', 'add_mce_button_custom_em');

然后我们声明并注册新的按钮:

// Declare script for new button
function add_tinymce_plugin_custom_em( $plugin_array ) {
    $plugin_array['custom_em'] = get_template_directory_uri() .'/plug/custom-em/custom-em.js';
    return $plugin_array;
}

// Register new button in the editor
function register_mce_button_custom_em( $buttons ) {
    array_push( $buttons, 'custom_em' );
    return $buttons;
}

最后,我们决定要显示哪些按钮 (更多关于 Content Formatting 的按钮) 。显然,如果你有 UX,你只能显示其中的几个,例如:

// TinyMCE: TinyMCE choose which buttons you want to display
function myformatTinyMCE( $in ) {
    $in['toolbar1'] = 'styleselect,bold,custom_em,blockquote,hr,aligncenter,link,unlink,spellchecker,undo,removeformat';
    return $in;
}
add_filter( 'tiny_mce_before_init', 'myformatTinyMCE' );

正如 add_tinymce_plugin_custom_em 函数所示,我们在 get_template_directory_uri() .'/plug/custom-em/custom-em.js'中声明一个 javascript 文件

所以创建 custom-em.js 文件,然后你有两种方法来解决这个问题。

您可以使用以下短代码格式 [shortcode foo="" bar=""][shortcode][/shortcode]

我们从 [shortcode foo="" bar=""]格式开始:

(function() {
    tinymce.create('tinymce.plugins.custom_em', {
        init : function(ed, url) {
            ed.addButton('custom_em', {
                title : 'Custom EM',
                image : url+'/images/btn_custom_em.png',
                onclick : function() {
                    ed.execCommand(
                        "mceInsertContent",
                        false,
                        "[shortcode foo="" bar=""]"
                    );
                }
            });
        }
    });
    tinymce.PluginManager.add('custom_em', tinymce.plugins.custom_em);
})();

您可以看到,我们使用图像作为按钮图标。您可以将其更改为文本,如下面的示例所述。

以下是我们在自己的平台上使用的,它将选择包含在:<em class="whatever">hello world</em>

(function() {
    tinymce.PluginManager.add('custom_em', function( editor, url ) {

        editor.on('init', function(e) {
            this.formatter.register('thetarget', {
                inline : 'em',
                classes : 'whatever'
            });
        });

        editor.addButton('custom_em', {
            text: 'Custom EM',
            icon: false,
            onclick : function() {
                var contents = editor.selection.getContent(),
                tags = jQuery(jQuery.parseHTML(contents)).find('em.whatever').andSelf();
                editor.formatter.toggle('thetarget');
            }
        });
    });
})(jQuery);

请发布结果并执行编辑。 TinyMCE 是一个瘟疫,需要头痛,但可以协同解决。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。