动态加载wordpress wp_editor(ajax)

时间:2014-02-03 03:41:19

标签: javascript jquery ajax wordpress wysiwyg

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

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

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

2 个答案:

答案 0 :(得分:7)

可能涉及黑客攻击,然而,我试图最小化它们。

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

  1. TinyMCE的
  2. 入住标签
  3. 对于[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){}
      

    湾需要数据在提交之前写回textarea

    • 解决方案是[绑定点击按钮] - >在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;
      });
      

    对于[快速标签]:

    一个。重新初始化标签

    • [获取设置] - > [设置鼠标事件] - > [重新启动QTags]

    湾切换到正确的选项卡(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]。 一个简单的解决方案是使用js代码发回html,并在php中检测:

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

    关于js值中的默认设置:

    1. mce:tinyMCEPreInit.mceInit

    2. qtags:tinyMCEPreInit.qtInit

    3. 如果您尝试使用窗口小部件模式的默认设置,则需要找到默认设置。

      要获取小部件模板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__' );
      }
      

      所以你可以通过以下方式获得设置:

      1. 对于mce:

        var init;
        if( typeof tinyMCEPreInit.mceInit[ id ] == 'undefined' ){
            init = tinyMCEPreInit.mceInit[ id ] = tinymce.extend( {}, tinyMCEPreInit.mceInit[ getTemplateWidgetId( id ) ] );
        }else{
            init = tinyMCEPreInit.mceInit[ id ];
        }
        
      2. 对于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 ];
        }
        
      3. 有关完整的代码示例,请查看:https://github.com/hezachary/wordpress-wysiwyg-widget/blob/master/widget_wp_editor.class.php

        如果有人想在菜单漫步中使用wp_editor进行管理,原则应该是相同的。

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

答案 1 :(得分:4)

工作解决方案:

P.S。你曾在WP.SE询问过:https://wordpress.stackexchange.com/a/192132/33667

在wordpress中添加操作,让我们说My_Action_Name(另请注意,textarea ID My_TextAreaID_22):

add_action('wp_ajax_My_Action_Name', function(){
    wp_editor( $_POST['default_text'], 'My_TextAreaID_22',      $settings = array( 'tinymce'=>true, 'textarea_name'=>'name77', 'wpautop' =>false,   'media_buttons' => true ,   'teeny' => false, 'quicktags'=>true, )   );    exit;
});

现在,在仪表板中,执行此功能(注意,使用 My_TextAreaID_22 My_Action_Name ):

function start_Ajax_request() { 
    Alert("I have started");
    My_New_Global_Settings =  tinyMCEPreInit.mceInit.content;       // Get default Wordpress SETTINGS  ( I cant confirm, but if you will need to change target ID, then add this line:  My_New_Global_Settings.selector = "My_TextAreaID_22";   )
    jQuery.post(ajaxurl,
        { action: "My_Action_Name",     default_text: "Hello World"}, 
        function(response,status){ 
            Alert("I have Finished");
            tinymce.init(My_New_Global_Settings); 
            tinyMCE.execCommand('mceAddEditor', false, "My_TextAreaID_22"); 
            quicktags({id : "My_TextAreaID_22"});
        }
    );

}   
start_Ajax_request();     // < ---- EXECUTE