
WooCommerce 评论本质上是 WordPress 的 comment 类型,而非独立的自定义文章类型;因此需使用 'comment' 作为 add_meta_box() 的屏幕参数,并选用 'normal' 或 'advanced' 上下文,才能正确注册评论编辑页的自定义元框。
woocommerce 评论本质上是 wordpress 的 `comment` 类型,而非独立的自定义文章类型;因此需使用 `'comment'` 作为 `add_meta_box()` 的屏幕参数,并选用 `'normal'` 或 `'advanced'` 上下文,才能正确注册评论编辑页的自定义元框。
在 WordPress 后台编辑 WooCommerce 商品评论时(路径通常为:评论 → 所有评论 → 点击某条评论进入编辑页),你可能会希望扩展评论管理界面,例如添加审核备注、客户联系方式、订单关联 ID 等自定义字段。但需特别注意:WooCommerce 并未创建名为 product-reviews 的独立文章类型——所有商品评论均以标准 comment 对象存储,其管理界面隶属于 WordPress 原生的「评论」后台模块。
因此,你原代码中将 add_meta_box() 的第 3 个参数($screen)设为 'product-reviews' 是无效的,该 screen 名称不存在,导致元框无法渲染。正确做法是使用 'comment',并配合合适的上下文(context)。虽然 WordPress 官方文档提及 'side' 在评论页理论上可用,但实际兼容性较差;经验证,'normal' 或 'advanced' 更稳定可靠。
以下是完整、可直接使用的实现代码(建议放入主题的 functions.php 或专用插件中):
// 注册评论页自定义元框
function kral_product_review_metabox() {
add_meta_box(
'kral_product_review', // HTML ID(唯一标识)
'اطلاعات دیدگاه', // 标题(支持中文)
'kral_product_review_fields_metabox', // 回调函数
'comment', // ✅ 关键:必须为 'comment'
'normal', // ✅ 推荐使用 'normal' 或 'advanced'
'default' // 优先级('default', 'high', 'low')
);
}
add_action('add_meta_boxes_comment', 'kral_product_review_metabox'); // 注意钩子名:add_meta_boxes_comment
// 渲染元框表单字段
function kral_product_review_fields_metabox($comment) {
// 添加安全 nonce 字段
wp_nonce_field(basename(__FILE__), 'kral_product_review_nonce');
// 获取已保存的值(支持编辑时回显)
$saved_value = get_comment_meta($comment->comment_ID, 'kral_product_name', true);
?>
<p>
<label for="kral_product_name">客户备注</label>
<br><input class="widefat" type="text" name="kral_product_name" id="kral_product_name" value="<?php echo esc_attr($saved_value); ?>" placeholder="请输入备注信息..."></p>
<?php }
// 保存元字段数据
function kral_save_product_review_meta($comment_id) {
// 非 AJAX 请求校验
if (defined('DOING_AJAX') && DOING_AJAX) return;
// 校验 nonce
if (!isset($_POST['kral_product_review_nonce']) ||
!wp_verify_nonce($_POST['kral_product_review_nonce'], basename(__FILE__))) {
return;
}
// 校验用户权限(仅管理员/编辑者可保存)
if (!current_user_can('edit_comment', $comment_id)) {
return;
}
// 保存字段值(自动处理空值)
if (isset($_POST['kral_product_name'])) {
update_comment_meta(
$comment_id,
'kral_product_name',
sanitize_text_field($_POST['kral_product_name'])
);
}
}
add_action('edit_comment', 'kral_save_product_review_meta');
// (可选)在评论列表页显示简略信息(提升管理效率)
function kral_add_review_meta_column($columns) {
$new_columns = array();
foreach ($columns as $key => $title) {
$new_columns[$key] = $title;
if ($key === 'response') {
$new_columns['kral_meta'] = '备注';
}
}
return $new_columns;
}
add_filter('manage_edit-comments_columns', 'kral_add_review_meta_column');
function kral_populate_review_meta_column($column, $comment_ID) {
if ($column === 'kral_meta') {
$value = get_comment_meta($comment_ID, 'kral_product_name', true);
echo $value ? esc_html($value) : '<span class="na">—</span>';
}
}
add_action('manage_comments_custom_column', 'kral_populate_review_meta_column', 10, 2);
✅ 关键要点总结:
- 钩子必须用
add_meta_boxes_comment(而非泛用的add_meta_boxes),确保仅在评论页加载; -
add_meta_box()第 3 参数$screen必须为'comment'; - 上下文推荐
'normal',避免'side'兼容性问题; - 使用
get_comment_meta()/update_comment_meta()操作评论元数据,不可用get_post_meta(); - 务必校验
nonce和用户权限,防止未授权写入; - 如需增强管理体验,可配合自定义列表列(如上示例)快速查看关键字段。
完成部署后,进入「评论 → 所有评论」,点击任意一条 WooCommerce 商品评论进行编辑,即可看到标题为「اطلاعات دیدگاه」的自定义区域,输入内容并更新评论后,数据将持久化保存至数据库的 wp_commentmeta 表中。










