微小的MCE修改(插件)在WordPress 5.6中停止工作

时间:2020-12-21 作者:Zeth

不久前,我偶然发现了2015年的这篇文章,它展示了如何add Tiny MCE-buttons.

它已经工作了一年多了。但在最新的WordPress更新(到版本5.6)后,它停止了工作(添加的下拉按钮不再出现在UI中)。

值得注意的是,我对Tiny MCE进行了2次修改:

  • add_filter( \'mce_buttons\', \'custom_register_mce_button\' ); - 这仍然有效
  • add_filter( \'mce_external_plugins\', \'custom_add_tinymce_plugin\' ); - 停止工作
我在另一个站点上运行了相同的代码,该站点也已更新到5.6版。在这两个网站上消失的按钮都是相同的。所以我很确定是WP更新把事情搞砸了。

我已经检查了后端的源代码,可以在代码中找到它(因此我可以看到它已加载)。

我的代码

In functions.php:

/**
 * Add buttons in tinyMCE
 *
 * Source: https://wisdmlabs.com/blog/add-buttons-menu-options-tinymce-wordpress-post-editor/
 */
function custom_add_mce_button(){

    if( ! current_user_can( \'edit_posts\' ) && ! current_user_can( \'edit_pages\' ) ){
        return;
    }

    if( \'true\' == get_user_option( \'rich_editing\' ) ){
        add_filter( \'mce_external_plugins\', \'custom_add_tinymce_plugin\' );
        add_filter( \'mce_buttons\', \'custom_register_mce_button\' );
    }
}

add_action( \'admin_head\', \'custom_add_mce_button\' );

function custom_register_mce_button( $buttons ){
    array_push( $buttons, \'custom_mce_button\' );

    return $buttons;
}

function custom_add_tinymce_plugin( $plugin_array ){
    $plugin_array[\'custom_mce_button\'] = get_stylesheet_directory_uri() . \'/assets/admin/js/tiny-mce-buttons.js\';

    return $plugin_array;
}

The contents of tiny-mce-buttons.js:

( function() {
    tinymce.PluginManager.add(\'custom_mce_button\', function(editor, url) {
        editor.addButton(\'custom_mce_button\', {
            text: \'Buttons\',
            icon: false,
            type: \'menubutton\',
            menu: [
                {
                    text: \'Button (simple)\',
                    onclick: function() {
                        editor.insertContent(\'[button button_text="Read more" title="Google" link="https://google.com"]\');
                    }
                },
                {
                    text: \'Button (centered)\',
                    onclick: function() {
                        editor.insertContent(\'[button button_text="Read more" title="Google" link="https://google.com" class="zbtn__primary centered-button"]\');
                    }
                },
                {
                    text: \'Button (all properties)\',
                    onclick: function() {
                        editor.insertContent(\'[button button_text="Read more" link="https://google.com" title="Google" open_in_new_tab="yes" class="zbtn__primary"]\');
                    }
                }
            ]
        });
    });
})();

更新后,如何向微型MCE添加按钮?

更新我确实在使用经典编辑器ACF 使用经典编辑器作为所有所见即所得字段的默认值,这就是我遇到的问题Advanced Tiny MCE-plugin.

2 个回复
SO网友:Justin Roy

更新后,我身上发生了同样的事情。这似乎是WordPress新版本不包括jquery迁移的问题。默认情况下为js。

我不确定是否有永久解决方案,但安装此插件暂时解决了这个问题:https://wordpress.org/plugins/enable-jquery-migrate-helper/

SO网友:N3rdinator

如果有相同的问题,可以确认这似乎是jQuery的问题。我正在尝试使一个时事通讯插件再次可行,而原作者不再支持该插件。tinymce编辑器在更新到5.6之后也失败了。也许我会发布代码的详细信息。我们找到了原因。

第一部分:

function plugins_loaded() {
        global $builder_id, $email_newsletter, $wp_customize;

        if(isset($wp_customize)) {
            $customizer_theme = $this->get_customizer_theme();
            $builder_theme = $this->get_builder_theme();
            if($builder_id && $customizer_theme == $builder_theme) {
                //Behebung bekannter Kompatibilitätsprobleme
                add_action( \'init\', array( &$this, \'cleanup_customizer\'), 1 );

                add_action( \'setup_theme\' , array( &$this, \'setup_builder_header_footer\' ), 999 );
                add_filter( \'wp_default_editor\', array( &$this, \'force_default_editor\' ) );
                add_filter( \'user_can_richedit\', array( &$this, \'force_richedit\' ) );

                add_action( \'admin_head\', array( &$this, \'prepare_tinymce\' ), 999 );

                add_action( \'template_redirect\', array( &$this, \'enable_customizer\') );
            }
        }
第2部分

function prepare_tinymce() {
        global $enewsletter_tinymce;
        ob_start();

        $tinymce_options = array(
            \'teeny\' => false,
            \'media_buttons\' => true,
            \'quicktags\' => false,
            \'textarea_rows\' => 25,
            \'drag_drop_upload\' => true,
            \'tinymce\' => array(
                \'wp_skip_init\' => false,
                \'theme_advanced_disable\' => \'\',
                \'theme_advanced_buttons1_add\' => \'code\',
                \'theme_advanced_resize_horizontal\' => true,
                \'add_unload_trigger\' => false,
                \'resize\' => \'both\'
            ),
            \'editor_css\' => \'<style type="text/css">body { background: #000; }</style>\',
        );
        $email_content = $this->get_builder_email_content(\'\');
        wp_editor($email_content, \'content_tinymce\', $tinymce_options);

        $enewsletter_tinymce = ob_get_clean();
第3部分

public function render_content() {
        global $enewsletter_tinymce;
        ?>
        <span class="customize-control-title"><?php echo $this->label; ?></span>
        <textarea id="<?php echo $this->id; ?>" style="display:none" <?php echo $this->link(); ?>><?php echo esc_textarea($this->value()); ?></textarea>
        <?php
        echo $enewsletter_tinymce;
        ?>
        
        <script type="text/javascript">
            jQuery(document).ready( function() {
                var content = 0;
                // Unsere tinyMCE-Funktion feuert bei jeder Änderung
                tinymce_check_changes = setInterval(function() {
                        var check_content = tinyMCE.activeEditor.getContent({format : \'raw\'});
                        
                        if(check_content != content && check_content != \'<p><br data-mce-bogus="1"></p>\') {
                            content = check_content;

                            jQuery(\'#<?php echo $this->id; ?>\').val(content).trigger(\'change\');
                        }
                }, 2000);

                //enables resizing of email content box
                var resize;
                var prev_emce_width = 0;
                jQuery(\'#accordion-section-builder_email_content\').on(\'mousedown\', \'.mce-i-resize, #content_tinymce_resize\', function(){
                    resize_start();
                });
                jQuery(\'#accordion-section-builder_email_content h3\').click(function(){
                    resize_start();
                });
                jQuery("body").mouseup(function() {
                    clearInterval(resize);
                });

                function resize_start() {
                    resize = setInterval(function() {
                        emce_width = jQuery(\'#content_tinymce_ifr\').width()+65;
                        
                        if(emce_width >= \'490\' && emce_width != prev_emce_width) {
                            jQuery(\'#customize-controls\').css("-webkit-animation", "none");
                            jQuery(\'#customize-controls\').css("-moz-animation", "none");
                            jQuery(\'#customize-controls\').css("-ms-animation", "none");
                            jQuery(\'#customize-controls\').css("animation", "none");
                            prev_emce_width = emce_width;
                            jQuery(\'#customize-controls, #customize-footer-actions\').css("width", emce_width+"px");
                            jQuery(\'.wp-full-overlay\').css("margin-left", emce_width+"px");
                            jQuery(\'.wp-full-overlay-sidebar\').css("margin-left", "-"+emce_width+"px");
                        }
                    },50);  
                }
            });
        </script>
        <?php
    }
在调试中,我可以看到:UncaughtTypeError:无法读取null的属性“getContent”

我认为tinymce在最新的jQuery版本中有一个问题,即proberty和value之间存在差异。

相关推荐

Image editor is not loading

出于某种奇怪的原因,嵌入图像编辑器未加载<我已经在wp配置中启用了调试。php我已经100%禁用了插件并设置了默认主题,Javascript控制台或Apache2错误日志中都没有错误,安装了php gd,安装了imagemagick,安装了php curl,我可以丢弃服务器中缺少的模块,因为我在同一服务器中安装了另一个WP,并且图像编辑器工作正常我没有主意了,不确定是什么导致了这个问题:(