子比主题开发文档
使用指南Codestar Framework主题扩展在线部署AI 功能推荐插件赞助打赏

评论与互动

梳理子比主题评论提交、审核、置顶、点赞、收藏、关注、举报、消息和等级联动的扩展入口。

模块入口

评论和互动不是一个独立模块,而是分散在主题基础函数、Ajax 文件、评论模板、用户模块和消息模块里。

文件作用
action/comment.php评论提交、编辑、审核、驳回、删除、置顶
action/action.php文章点赞、评论点赞、文章收藏、关注用户
inc/functions/zib-comments-list.php评论列表、评论卡片、评论排序
inc/functions/zib-theme.php互动按钮、评论防刷、用户互动状态判断
inc/functions/user/ajax.php举报弹窗、举报提交
inc/functions/message/functions/new.php点赞、收藏、关注、评论等消息通知
inc/functions/user/user-level.php点赞、评论、关注等行为积分或等级联动

这组功能高度依赖登录态、nonce、权限、审核和缓存。扩展时优先挂主题已有 Hook,不要直接改用户 meta 或评论 meta。

评论 IP 来源、comment_addr 写入、前后台地址展示和归属地接口选择见 IP 归属地与位置展示。本页只保留评论提交与互动主流程。

评论提交流程

评论提交入口是 submit_comment

add_action('wp_ajax_submit_comment', 'zib_ajax_submit_comment');
add_action('wp_ajax_nopriv_submit_comment', 'zib_ajax_submit_comment');

zib_ajax_submit_comment() 会做这些事:

  1. 调用 zib_ajax_verify_nonce()
  2. 如果开启评论人机验证,调用 zib_ajax_man_machine_verification()
  3. 判断评论内容长度。
  4. 判断是否编辑已有评论。
  5. 根据权限、快捷回复、内容审核 API 判断是否免审核。
  6. 调用 wp_handle_comment_submission() 走 WordPress 原生评论流程。
  7. 未登录用户设置评论 Cookie。
  8. 使用 zib_get_comments_list() 返回前端可插入的评论 HTML。

扩展评论审核优先使用 WordPress 原生 Hook:

function zib_docs_comment_check($approved, $commentdata)
{
    if (empty($commentdata['comment_content'])) {
        return $approved;
    }

    if (strpos($commentdata['comment_content'], 'docs') !== false) {
        return 0;
    }

    return $approved;
}
add_filter('pre_comment_approved', 'zib_docs_comment_check', 20, 2);

不要直接替换 submit_comment。它已经串起 nonce、人机验证、内容审核、评论防刷和前端返回结构。

评论管理动作

action/comment.php 提供这些 Ajax:

Ajax action说明
approve_comment审核或驳回评论
get_comment获取评论数据,用于编辑
comment_set_topping设置或取消评论置顶
trash_comment删除评论到回收站
submit_comment提交或编辑评论

这些动作都通过 zib_current_user_can() 检查主题权限:

zib_current_user_can('comment_audit', $comment);
zib_current_user_can('comment_edit', $comment);
zib_current_user_can('comment_set_topping', $comment);
zib_current_user_can('comment_delete', $comment);

如果要新增评论管理动作,也要跟随这个权限模型,而不是只检查 is_super_admin()

评论置顶成功会触发:

do_action('comment_is_topping', $comment);

可以用来发消息或写操作日志:

function zib_docs_comment_topping_log($comment)
{
    if (empty($comment->comment_ID)) {
        return;
    }

    update_comment_meta($comment->comment_ID, 'docs_topping_time', current_time('mysql'));
}
add_action('comment_is_topping', 'zib_docs_comment_topping_log');

评论防刷

评论防刷在 inc/functions/zib-theme.php

add_filter('pre_comment_approved', 'zib_brush_limit_comment', 99, 2);

它读取 _pz('brush_limit_comment'),按当前用户、IP 或评论作者统计:

配置作用
minutes_1010 分钟内评论上限
day_1单日评论上限

管理员不受限制。扩展评论频率限制时,不要在前端只禁按钮,服务端必须兜底。

互动按钮

主题按钮由函数输出,前端再根据 data-action 发送请求:

函数data-action数据
zib_get_post_like()likepost meta like,user meta like-posts
zib_get_comment_like()comment_likecomment meta comment_like,user meta like-comment
zib_get_post_favorite()favoritepost meta favorite,user meta favorite-posts
zib_get_user_follow()follow_useruser meta follow-userfollowed-user

前端请求最终进入 action/action.php,并通过 type 区分:

switch ($type) {
    case 'comment_like':
        posts_action('like-comment', $post_id, $key, __('已赞!感谢您的支持', 'zib_language'), __('点赞已取消', 'zib_language'), true);
        break;

    case 'like':
        posts_action('like-posts', $post_id, $key, __('已赞!感谢您的支持', 'zib_language'), __('点赞已取消', 'zib_language'));
        break;

    case 'favorite':
        posts_action('favorite-posts', $post_id, $key, __('已收藏此文章', 'zib_language'), __('已取消收藏', 'zib_language'));
        break;

    case 'follow_user':
        follow_action('follow-user', 'followed-user', $post_id);
        break;
}

这条链路会更新计数、用户 meta,并触发业务 Hook。扩展时要挂 Hook,不要自己写一份点赞接口。

互动 Hook

互动成功时会触发:

do_action('like-posts', $post_id, $count, $user_id);
do_action('favorite-posts', $post_id, $count, $user_id);
do_action('like-comment', $comment_id, $count, $user_id);
do_action('follow-user', $user_id, $followed_user_id, $follow_count, $followed_count);

主题已有消息和等级模块监听这些 Hook:

Hook已有联动
like-posts文章点赞消息、用户等级
favorite-posts文章收藏消息、用户等级
like-comment评论点赞消息、用户等级
follow-user关注消息、用户等级

新增联动示例:

function zib_docs_like_posts_mark($post_id, $count, $user_id)
{
    if (!$post_id || !$user_id) {
        return;
    }

    update_post_meta($post_id, 'docs_last_like_user', $user_id);
}
add_action('like-posts', 'zib_docs_like_posts_mark', 20, 3);

如果要统计取消点赞,需要注意:主题只在新增时触发这些 Hook,取消时只返回 Ajax 数据并更新计数。取消行为要另外从前端或自定义入口补充,不要误以为 Hook 会覆盖新增和取消两个方向。

举报流程

举报入口在用户模块:

add_action('wp_ajax_report_modal', 'zib_ajax_report_modal');
add_action('wp_ajax_nopriv_report_modal', 'zib_ajax_report_modal');
add_action('wp_ajax_report_user', 'zib_ajax_report_user');
add_action('wp_ajax_nopriv_report_user', 'zib_ajax_report_user');

report_modal 会验证 report_modal nonce 并输出 zib_get_report_modal()report_user 会收集举报类型、说明、图片证据,并写入后台处理数据,同时发送管理员通知。

扩展举报时要保留:

  1. 举报对象校验。
  2. nonce 校验。
  3. 人机验证或频率限制。
  4. 证据图片数量和格式限制。
  5. 后台处理入口。
  6. 站内消息或微信模板消息通知。

商品评价与普通评论不同

商城商品评价使用 WordPress comment 存储,但入口不是普通 submit_comment。评价会从订单状态进入:

文件说明
inc/functions/shop/action/action.phporder_comment_modalshop_order_comment
inc/functions/shop/inc/comment.php评价创建、评分、图片、订单评价状态
inc/functions/shop/template/comments.php商品评价模板

商品评价成功会写:

update_comment_meta($comment_id, 'score', $score_data['average']);
zib_update_comment_meta($comment_id, 'score_data', $comment_score_data);
zib_update_comment_meta($comment_id, 'order_data', $comment_order_data);
zib_shop_update_order_comment_status($order_id, 1);

更完整的状态机、评分字段、筛选参数、移动端抽屉和相关推荐链路见 商城模块。这里需要记住的边界是:商品评价虽然存在 comment 表里,但它的入口属于商城订单,不属于普通评论表单。

扩展商品评价时不要绕过订单状态,否则用户可能重复评价、售后状态异常,或商品评分统计、好评数量、有图数量、自动好评和评论缓存不更新。

缓存和权限

  • 评论列表可以缓存片段,但评论提交、审核、删除、置顶不能缓存 Ajax 响应。
  • 点赞、收藏、关注依赖当前用户 meta,不能被游客缓存错误固定。
  • 评论置顶、审核、删除要按 zib_current_user_can() 判断。
  • 举报、评论、私信都可能带图片,上传能力要走主题媒体上传限制。
  • 互动 Hook 已经被消息和等级模块监听,重复发消息前先确认不会双发。

调试入口

现象优先检查
评论提交失败submit_comment、nonce、人机验证、pre_comment_approved
评论一直待审核内容审核、免审核权限、WordPress 讨论设置
点赞收藏无反应action/action.phppost_action nonce、登录态
关注失败是否登录、目标用户是否当前用户、follow-user meta
举报弹窗打不开report_modal nonce、RefreshModal、安全插件
商品评价异常订单状态、comment_status meta、商品评价设置

参考源码

本页根据 action/comment.phpaction/action.phpinc/functions/zib-theme.phpinc/functions/zib-comments-list.phpinc/functions/user/ajax.phpinc/functions/message/functions/new.phpinc/functions/shop/inc/comment.php 蒸馏整理。

On this page