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

Posted

技术标签:

【中文标题】WP Editor - wp_editor() 在 ajax 调用中未正确显示【英文标题】:WP Editor - wp_editor() is not showing properly on ajax call 【发布时间】:2016-03-11 17:31:13 【问题描述】:

我正在创建一个 WordPress 插件。它具有通过 AJAX 添加产品时显示编辑器的功能,但编辑器无法正确显示。

用户可以根据需要添加任意数量的产品,因此请记住,wp_editor() 会不止一个

请参考所附截图:

我使用了以下代码:

PHP

public function add_product() 

        // Get product id
        $prod_id = filter_input(INPUT_POST, 'pid');

        // WordPress WYSIWYG Editor
        wp_editor("Test Content", "textarea" . $prod_id, array('textarea_name' => 'text'));
        wp_die();

JQUERY

$('.add-prod').live('click', function () 

        var prod_id = $('.prod-id').val();
        var data = 
            action: 'add_prod',
            pid: prod_id
        ;
        $('#update-msg').show();

        $.post(ajaxurl, data, function (result) 
            $('#the-list').append(result);
            $('#update-msg').hide();
        );

        return false;
);

我使用了来自互联网的解决方案,但它的部分工作并没有完全发挥作用。使用以下代码:

PHP

wp_editor($product->prod_desc, $textarea_id, array('textarea_name' => 'text'));
\_WP_Editors::enqueue_scripts();
print_footer_scripts();
\_WP_Editors::editor_js();

JQUERY

var eid = '#item-list';
switchEditors.go(eid, 'tmce')
quicktags(id: eid);
//init tinymce
tinyMCEPreInit.mceInit[eid]['elements'] = eid;
tinyMCEPreInit.mceInit[eid]['body_class'] = eid;
tinyMCEPreInit.mceInit[eid]['succesful'] = false;
tinymce.init(tinyMCEPreInit.mceInit[eid]);

上面的代码就是这样做的:

【问题讨论】:

我现在的代码一切正常。只是编辑器不工作。 我创建了一个动态加载 wp 编辑器的帖子here。 我创建了一个动态创建WP编辑器here的帖子。 【参考方案1】:

显然 wp_editor 不会显示,因为您正在进行 ajax 调用,它只返回 ajax 响应,而不是由该页面上的 javascript 构建的 wp 编辑器。简而言之,ajax 调用可以获取服务器端文本响应,但不能获取构建在客户端并需要 javascript 处理器处理的 javascript 编辑器。

以下可以是 suedo 示例,说明如何使编辑器正常工作。

    就在“添加产品”按钮下方,从那里进行 ajax 调用,使用 php 代码打印一个编辑器并将其显示设置为无,这样编辑器就不会出现在页面上。

例如

<div class="wp-editor-wrapper" style="display: none;">
     <?php wp_editor("Test Content", "textarea" . $prod_id, array('textarea_name' => 'text')); ?>
</div>

    ajax 响应的 php 函数应该只返回文本内容。不是编辑器本身,它应该是这样的。

    公共函数 add_product()

        // Get product id
        $prod_id = filter_input(INPUT_POST, 'pid');
    
        // if $prod_id is used here, use it to get content
        echo "Test Content";
        wp_die();
    

    收到文本内容的响应时, 使用 jQuery,创建“wp-editor-wrapper” div 的克隆并将其添加到 textarea 的位置,并从 ajax 响应中设置其内容。

【讨论】:

似乎是一个不错的解决方案...但是如何从 ajax 响应中设置其内容? CKEDITOR.instance.[CKEDITOR 中使用的名称].setData(ajaxResponse);可以在任何 js 文件中使用,只要它是在加载 ckeditor.js 之后出现的。【参考方案2】:

我想我通过使用 window.QTags 函数找到了更优雅的解决方案。 如果您尝试从调试控制台调用 tinyMCEPreInit,您应该能够访问对象的 qtInit 属性。

console.log(tinyMCEPreInit.qtInit);

它应该返回类似这样的东西


   editor_0: id: "editor_1", buttons: "strong,em,link,block,del,ins,img,ul,ol,li,code,more,close"

所以在你的 ajax 调用完成后,尝试复制这个属性,将一个 id 替换为一个新的,然后调用 QTags 函数。所有按钮都应该出现。

window.QTags('id': `YOUR_NEW_ID_HERE`, 'buttons': "strong,em,link,block,del,ins,img,ul,ol,li,code,more,close");

【讨论】:

以上是关于WP Editor - wp_editor() 在 ajax 调用中未正确显示的主要内容,如果未能解决你的问题,请参考以下文章

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

动态加载 wordpress wp_editor (ajax)

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

板邓:wp_editor编辑器功能增强版

动态生成的 Wordpress 所见即所得编辑器 (wp_editor) 无法正确显示

调用 wp_editor 得到错误 getContent null