动态加载wordpress wp_editor(ajax)

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

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

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

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

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

  1. TinyMCE的
  2. 入住标签

对于[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

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

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

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

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

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

工作方案:

ps你在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; }); 

现在,在仪表板中,执行此function(注意,使用My_TextAreaID_22My_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 

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

 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.在JSax代码中添加的Ajax内容