Javascript 动态加载wordpress wp_编辑器(ajax)

Javascript 动态加载wordpress wp_编辑器(ajax),javascript,jquery,ajax,wordpress,wysiwyg,Javascript,Jquery,Ajax,Wordpress,Wysiwyg,这是一个答案/解决方案,而不是一个问题,尽管我在我的dev env上尝试过,但仍然可能存在一些bug 我最近尝试在widget/菜单中使用wp_编辑器,经过一些搜索,我没有找到我想要的完整解决方案 在我按小时深入研究wp的代码后,我将在下面分享我的解决方案:可能涉及黑客攻击,但是,我尝试将其最小化 要使wp_编辑器能够在动态html中工作(这意味着在不重新加载页面的情况下,js会更改页面结构),需要注意两个主要问题: 蒂尼姆斯 qucik标签 对于[tinymce]: a。需要正确重置用户界面吗

这是一个答案/解决方案,而不是一个问题,尽管我在我的dev env上尝试过,但仍然可能存在一些bug

我最近尝试在widget/菜单中使用wp_编辑器,经过一些搜索,我没有找到我想要的完整解决方案


在我按小时深入研究wp的代码后,我将在下面分享我的解决方案:

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

要使wp_编辑器能够在动态html中工作(这意味着在不重新加载页面的情况下,js会更改页面结构),需要注意两个主要问题:

  • 蒂尼姆斯
  • qucik标签
  • 对于[tinymce]:

    a。需要正确重置用户界面吗

    • 解决方案是[remove mce instance]->[get-Right mce settings]->[re-init a new mce instance]

    • 在js代码中(id表示文本区域id):

    b。提交前需要将数据写回textarea

    • 解决方案是[bind click to button]->在submt::[关闭mce]->[打开提交]
    • 在js代码中:

      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;
      });
      
      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] );
      }
      
      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__' );
      }
      
    对于[快速标记]:

    a。重新初始化标记

    • [获取设置]->[设置鼠标事件]->[重新初始化QTags]
    b。切换到正确的选项卡(mce选项卡或快速标记选项卡)

    • [切换到当前选项卡模式]

    • 以上两种在js代码中都有:

      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;
      });
      
      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] );
      }
      
      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__' );
      }
      
    另外,请记住,如果您使用ajax,每次回发mce UI时,您都需要在js中重新执行[reset mce UI]和[Qtags]。 一个简单的解决方案是在回发html中使用js代码,并在php中检测:

    $isAjax=defined('DOING_AJAX')&&DOING_AJAX==true)

    关于js值中的默认设置:

  • mce:
    tinyMCEPreInit.mceInit

  • qtags:
    tinyMCEPreInit.qtInit

  • 如果您尝试使用小部件模式的默认设置,则需要找到默认设置

    要获取小部件模板id,请使用js代码:

    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;
    });
    
    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] );
    }
    
    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__' );
    }
    
    因此,您可以通过以下方式获得设置:

  • 对于mce:

    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 ];
    }
    
  • 有关完整的代码示例,请检查:

    如果有人想在管理员的菜单漫游中使用wp_编辑器,原则应该是相同的


    如果您有任何问题或更好的解决方案,请发表意见,谢谢。

    我也遇到过类似的问题。我用以下方法解决了这个问题
    1.添加了以下过滤器以在主页面中始终以可视模式打开编辑器

    add_filter( 'wp_default_editor', create_function('', 'return "tinymce";') );
    


    2.在Ajax中,以下内容用于编辑器

    wp_editor( $content, "editor_ajax", array('textarea_name'=>"content_ajax",'quicktags' => array('buttons' => 'strong,em,link,block,del,ins,img,ul,ol,li,code,close')));
    


    3.在Ajax中,添加了以下JS代码内容

    <script src="<?php bloginfo('home')?>/wp-includes/js/quicktags.min.js"</script>
    <script>
    jQuery(document).ready(function(){
    
        ed_id =  "editor_ajax";
        quicktags({id : ed_id,buttons:"strong,em,link,block,del,ins,img,ul,ol,li,code,more,close,dfw"});
        tinyMCE.execCommand('mceAddEditor', false, fullId); 
    
    });
    </script>
    
    工作解决方案:
    p、 美国。你应该在WP.SE询问:


    在wordpress中添加操作,比如说
    My_action\u Name
    (另请注意,textarea ID
    My_textarea ID\u 22
    ):

    现在,在仪表板中执行此功能(注意,使用
    我的文本区域ID\u 22
    我的操作\u名称
    ):

    function start\u Ajax\u request(){
    警惕(“我已经开始”);
    My_New_Global_Settings=tinyMCEPreInit.mceInit.content;//获取默认Wordpress设置(我无法确认,但如果需要更改目标ID,请添加此行:My_New_Global_Settings.selector=“My_TextAreaID_22”)
    jQuery.post(ajaxurl,
    {操作:“我的操作名称”,默认文本:“Hello World”},
    功能(响应、状态){
    警惕(“我已经完成”);
    tinymce.init(我的新全局设置);
    tinyMCE.execCommand('mceAddEditor',false,“My_TextAreaID_22”);
    快速标记({id:“My_TextAreaID_22”});
    }
    );
    }   
    启动Ajax请求();//<---执行
    
    您必须执行
    新的QTags(tinyMCEPreInit.qtInit[id])。检查浏览器控制台中的
    QTags.instances
    ,查看此处显示的原因: