动态加载 wordpress wp_editor (ajax)

Posted

技术标签:

【中文标题】动态加载 wordpress wp_editor (ajax)【英文标题】:load wordpress wp_editor dynamically (ajax) 【发布时间】:2014-02-26 11:09:10 【问题描述】:

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

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

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

【问题讨论】:

在这里提问:wordpress.stackexchange.com/a/192132/33667 【参考方案1】:

可能涉及黑客攻击,但我尽量减少它们。

要让wp_editor可以在动态html中工作(也就是说不用重新加载页面,js改变页面结构),有两个主要问题需要注意:

    小小 qucik 标签

对于 [tinymce]:

一个。需要正确重置用户界面

解决方案是 [删除 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

解决方案是[绑定点击按钮] -> on 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]

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 时使用 js 代码,并在 php 中检测:

$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__' );

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

    对于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 ];
    
    

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

如果有人想在admin的menu walk中使用wp_editor,原理应该是一样的。

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

【讨论】:

你必须做new QTags( tinyMCEPreInit.qtInit[ id ] );。在浏览器控制台中查看QTags.instances 了解原因【参考方案2】:

工作解决方案:

附言你会在 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;
);

现在,在 Dashboard 中执行此功能(注意,使用 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

【讨论】:

【参考方案3】:

我也遇到过类似的问题。我通过使用以下 解决了这个问题 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>

【讨论】:

以上是关于动态加载 wordpress wp_editor (ajax)的主要内容,如果未能解决你的问题,请参考以下文章

使用 WordPress TinyMCE wp_editor() 时如何设置占位符文本

调用 wp_editor 得到错误 getContent null

WP Editor - wp_editor() 在 ajax 调用中未正确显示

使用 Wordpress 动态加载帖子

如何在单个页面中添加多个 wp_editor

未记录时使用 wp_editor() 停止工作