这是一个答案/解决方案,而不是一个问题,即使我尝试使用我的开发环境,仍然可能存在一些错误。

我最近尝试在小部件/菜单中使用wp_editor,经过一番搜索,我没有找到想要的完整解决方案。

在按小时挖掘wp的代码后,我将在下面分享我的解决方案:

最佳答案

可能涉及黑客攻击,但是,我尝试将其最小化。

为了使wp_editor可以在动态html中工作(这意味着在不重新加载页面的情况下,js会更改页面结构),需要注意两个主要问题:

  • tinymce
  • qucik-tags

  • 对于[tinymce]:

    一种。需要正确重置UI
  • 解决方案是[删除mce实例]-> [获取正确的mce设置]-> [重新初始化新的mce实例]
  • js代码中的
  • (id表示textarea id):
    tinymce.execCommand('mceRemoveEditor', true, id);
    var init = tinymce.extend( {}, tinyMCEPreInit.mceInit[ id ] );
    try { tinymce.init( init ); } catch(e){}
    

  • b。提交前需要将数据写回textarea
  • 解决方案是[bind click to button]-> on submt::[关闭mce]-> [打开提交]
  • jst中的
  • :
    jq('textarea[id="' + id + '"]').closest('form').find('input[type="submit"]').click(function(){
        if( getUserSetting( 'editor' ) == 'tmce' ){
            var id = mce.find( 'textarea' ).attr( 'id' );
            tinymce.execCommand( 'mceRemoveEditor', false, id );
            tinymce.execCommand( 'mceAddEditor', false, id );
        }
        return true;
    });
    

  • 对于[快速标记]:

    一种。重新初始化标签
  • [获取设置]-> [设置鼠标事件]-> [重新初始化QTags]

  • b。切换到适当的标签(MCE标签或快速标签标签)
  • [切换到当前标签页模式]
  • 都在js代码中:
    if ( typeof(QTags) == 'function' ) {
        jq( '[id="wp-' + id + '-wrap"]' ).unbind( 'onmousedown' );
        jq( '[id="wp-' + id + '-wrap"]' ).bind( 'onmousedown', function(){
            wpActiveEditor = id;
        });
        QTags( tinyMCEPreInit.qtInit[ id ] );
        QTags._buttonsInit();
        switchEditors.switchto( jq( 'textarea[id="' + id + '"]' ).closest( '.widget-mce' ).find( '.wp-switch-editor.switch-' + ( getUserSetting( 'editor' ) == 'html' ? 'html' : 'tmce' ) )[0] );
    }
    

  • 另外,请记住,如果您使用的是Ajax,则每次回传mce UI时,都需要在js中重新执行[reset mce UI]和[Qtags]。
    一个简单的解决方案是在回发html并在php中检测以下内容时使用js代码:
    $isAjax = defined( 'DOING_AJAX' ) && DOING_AJAX == true );
    关于js值的默认设置:
  • mce:tinyMCEPreInit.mceInit
  • qtags:tinyMCEPreInit.qtInit

  • 如果尝试将默认设置用于小部件模式,则需要找到默认设置。

    要获取小部件模板ID,请使用js代码:
    function getTemplateWidgetId( id ){
            var form = jQuery( 'textarea[id="' + id + '"]' ).closest( 'form' );
            var id_base = form.find( 'input[name="id_base"]' ).val();
            var widget_id = form.find( 'input[name="widget-id"]' ).val();
            return id.replace( widget_id, id_base + '-__i__' );
    }
    

    因此,您可以通过以下方式获取设置:

    mct的
  • :
    var init;
    if( typeof tinyMCEPreInit.mceInit[ id ] == 'undefined' ){
        init = tinyMCEPreInit.mceInit[ id ] = tinymce.extend( {}, tinyMCEPreInit.mceInit[ getTemplateWidgetId( id ) ] );
    }else{
        init = tinyMCEPreInit.mceInit[ id ];
    }
    
  • 对于Qtags:
    var qInit;
    if( typeof tinyMCEPreInit.qtInit[ id ] == 'undefined' ){
        qInit = tinyMCEPreInit.qtInit[ id ] = jq.extend( {}, tinyMCEPreInit.qtInit[ getTemplateWidgetId( id ) ] );
        qInit['id'] = id;
    }else{
        qInit = tinyMCEPreInit.qtInit[ id ];
    }
    

  • 有关完整的代码示例,请检查:https://github.com/hezachary/wordpress-wysiwyg-widget/blob/master/widget_wp_editor.class.php

    如果有人想在菜单 list 中使用wp_editor进行管理,则原理应相同。

    如果您有任何疑问或更好的解决方案,请发表评论,谢谢。

    10-02 15:44