12

我正在创建一个 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();
}

查询

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

查询

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]);

上面的代码是这样做的:

在此处输入图像描述

4

2 回答 2

3

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

以下可以是 suedo 示例,说明可以做些什么来使编辑器正常工作。

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

例如

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

    }

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

于 2015-12-20T06:55:04.117 回答
0

我想我通过使用 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"});
于 2019-04-13T20:02:39.017 回答