You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WooCommerce单产品页移出选项卡的评论模块不显示已发布评论

故障根因

把评论模块直接挂载到woocommerce_after_single_product_summary钩子时,全局$wp_query的评论查询上下文没有正确初始化:have_comments()默认读取全局主查询的评论数据集,这个钩子触发时要么主查询还没完成产品评论的预加载,要么被前面自定义选项卡的其他查询污染了全局评论变量,自然读不到评论数据。
星级评分能正常显示是因为评分数据存在产品的post meta表里,读取逻辑不依赖评论查询,所以不受影响。

修复步骤
  • 替换默认评论判断逻辑,手动指定评论查询范围
    不要依赖全局的have_comments()判断,直接在你修改的single-product-reviews.php中替换原有评论渲染代码段如下:

    <?php
    global $product;
    if ( ! $product ) return;
    
    // 构造WooCommerce产品评价专属查询参数
    $review_args = [
        'post_id' => $product->get_id(),
        'status'  => 'approve',
        'type'    => 'review', // *必须指定评论类型为review*,排除普通评论、pingback等无关内容
        'number'  => (int)get_option('comments_per_page'),
    ];
    $review_query = new WP_Comment_Query($review_args);
    $reviews = $review_query->comments;
    
    if ( $reviews ) : ?>
        <ol class="commentlist">
            <?php wp_list_comments( apply_filters( 'woocommerce_product_review_list_args', [
                'callback' => 'woocommerce_comments',
                'comments' => $reviews // 手动传入查询到的评价列表,不读取全局变量
            ] ) ); ?>
        </ol>
    
        <?php
        $max_pages = ceil( $review_query->found_comments / (int)get_option('comments_per_page') );
        if ( $max_pages > 1 && get_option( 'page_comments' ) ) :
            echo '<nav class="woocommerce-pagination">';
            paginate_comments_links(
                apply_filters(
                    'woocommerce_comment_pagination_args',
                    [
                        'prev_text' => is_rtl() ? '&rarr;' : '&larr;',
                        'next_text' => is_rtl() ? '&larr;' : '&rarr;',
                        'type'      => 'list',
                        'total'     => $max_pages,
                    ]
                )
            );
            echo '</nav>';
        endif;
        ?>
    <?php else : ?>
        <p class="woocommerce-noreviews"><?php esc_html_e( 'There are no reviews yet.', 'woocommerce' ); ?></p>
    <?php endif; ?>
    </div>
    
  • 调整钩子挂载优先级
    如果你是通过add_action引入这个自定义评论模板,把执行优先级调到20以上,等WooCommerce默认的产品摘要、分享等模块渲染完成后再加载评论,避免上下文冲突:

    // 错误写法:优先级太低,容易被前面的逻辑打断
    // add_action('woocommerce_after_single_product_summary', 'custom_render_reviews', 10);
    // 正确写法
    add_action('woocommerce_after_single_product_summary', 'custom_render_reviews', 25);
    function custom_render_reviews() {
        // 模板放在主题woocommerce目录下时,用wc_get_template引入更规范
        wc_get_template('single-product-reviews.php');
    }
    
  • 排查第三方插件/主题的评论过滤冲突
    如果改完以上两步还是不显示,检查安装的评论插件、SEO插件有没有通过pre_get_comments钩子加全局评论过滤,在评论查询代码前临时移除冲突过滤即可:

    // 临时移除全局评论过滤
    remove_all_filters('pre_get_comments', 10);
    // 执行上面的评论查询逻辑
    
注意事项

如果在评论模块前写了自定义文章查询,一定要加wp_reset_query()恢复全局主查询,否则也会导致评论数据读取异常。修复后清空页面缓存、对象缓存再刷新验证即可。


内容的提问来源于stack exchange,提问作者uroborosfault

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 11:18:15