WP 编辑器 - wp_editor() 在 ajax 调用中未正确显示
WP Editor - wp_editor() is not showing properly on ajax call
我正在创建一个 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_editor 不会出现,因为你正在进行 ajax 调用,只有 returns ajax 响应而不是由 javascript 在那个页面上。简而言之,ajax 调用可以得到服务器端的文本响应,但不能得到 javascript 编辑器,它是在客户端构建的,需要 javascript 处理器来处理。
以下是可以使编辑器正常工作的示例。
- 就在 "add product" 按钮下方,从那里进行 ajax 调用,使用 php 代码打印编辑器并将其显示设置为 none 这样编辑器就不会没有出现在页面上。
例如
<div class="wp-editor-wrapper" style="display: none;">
<?php wp_editor("Test Content", "textarea" . $prod_id, array('textarea_name' => 'text')); ?>
</div>
php ajax 响应的函数应该只有 return 文本内容。不是编辑器本身,它应该是这样的。
public 函数 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 响应设置其内容。
我想我通过使用 window.QTags 函数找到了更优雅的解决方案。
如果您尝试从调试控制台调用 tinyMCEPreInit,您应该能够到达对象的 qtInit 属性。
console.log(tinyMCEPreInit.qtInit);
应该return像这样
{
editor_0: {id: "editor_1", buttons: "strong,em,link,block,del,ins,img,ul,ol,li,code,more,close"}
}
因此,在您的 ajax 调用完成后,尝试复制此 属性,将 id 替换为新的 id 并调用 QTags 函数。应显示所有按钮。
window.QTags({'id': `YOUR_NEW_ID_HERE`, 'buttons': "strong,em,link,block,del,ins,img,ul,ol,li,code,more,close"});
我正在创建一个 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_editor 不会出现,因为你正在进行 ajax 调用,只有 returns ajax 响应而不是由 javascript 在那个页面上。简而言之,ajax 调用可以得到服务器端的文本响应,但不能得到 javascript 编辑器,它是在客户端构建的,需要 javascript 处理器来处理。
以下是可以使编辑器正常工作的示例。
- 就在 "add product" 按钮下方,从那里进行 ajax 调用,使用 php 代码打印编辑器并将其显示设置为 none 这样编辑器就不会没有出现在页面上。
例如
<div class="wp-editor-wrapper" style="display: none;">
<?php wp_editor("Test Content", "textarea" . $prod_id, array('textarea_name' => 'text')); ?>
</div>
php ajax 响应的函数应该只有 return 文本内容。不是编辑器本身,它应该是这样的。
public 函数 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 响应设置其内容。
我想我通过使用 window.QTags 函数找到了更优雅的解决方案。 如果您尝试从调试控制台调用 tinyMCEPreInit,您应该能够到达对象的 qtInit 属性。
console.log(tinyMCEPreInit.qtInit);
应该return像这样
{
editor_0: {id: "editor_1", buttons: "strong,em,link,block,del,ins,img,ul,ol,li,code,more,close"}
}
因此,在您的 ajax 调用完成后,尝试复制此 属性,将 id 替换为新的 id 并调用 QTags 函数。应显示所有按钮。
window.QTags({'id': `YOUR_NEW_ID_HERE`, 'buttons': "strong,em,link,block,del,ins,img,ul,ol,li,code,more,close"});