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

wp_head钩子获取产品ID触发无报错白屏问题咨询

问题根源

白屏是PHP致命错误导致的,核心问题是代码缺少前置校验:

  • wp_head是全站触发的钩子,首页、文章页、分类页、404页等所有页面都会执行你挂载的函数,不止商品详情页
  • 非商品页面下,不管是global $product还是wc_get_product($post->ID),都拿不到有效的WC_Product实例,要么变量未定义,要么返回布尔值false
  • 你后续直接调用$product->is_type()这类成员方法,属于在非对象上调用方法,直接触发PHP致命错误,生产环境默认关闭错误显示,就表现为无提示白屏
正确实现代码

修复逻辑非常直接:先判断当前页面是否为商品详情页、校验拿到的产品对象是否有效,再执行库存判断和noindex输出,非商品页直接终止函数逻辑即可,兼容简单商品、可变商品场景:

// 为缺货商品添加noindex标签
add_action( 'wp_head', 'add_tagseo_headmeta' );
function add_tagseo_headmeta() {
    // 非单商品页直接退出,避免非商品页触发报错
    if ( ! is_singular( 'product' ) ) {
        return;
    }

    global $post;
    $product = wc_get_product( $post->ID );

    // 校验产品对象有效性,无效直接退出
    if ( ! $product instanceof WC_Product ) {
        return;
    }

    // 简单商品:库存小于1则输出noindex
    if ( $product->is_type( 'simple' ) ) {
        $stock_quantity = (int) get_post_meta( $post->ID, '_stock', true );
        if ( $stock_quantity < 1 ) {
            echo '<meta name="robots" content="noindex">';
        }
    }

    // 可变商品:所有可见变体库存总和小于1则输出noindex
    if ( $product->is_type( 'variable' ) ) {
        $total_stock = 0;
        foreach ( $product->get_visible_children() as $variation_id ) {
            $variation = wc_get_product( $variation_id );
            if ( $variation ) {
                $total_stock += (int) $variation->get_stock_quantity();
            }
        }
        if ( $total_stock < 1 ) {
            echo '<meta name="robots" content="noindex">';
        }
    }
}
额外注意事项
  • 不需要把钩子优先级设为1,用默认优先级10即可,避免和WooCommerce本身、主题的头部输出逻辑冲突
  • 如果需要给缺货商品对应的分类归档页也加noindex,可以额外判断is_product_taxonomy()场景,再针对归档页商品列表做全缺货判断,不要直接在非单商品页调用产品对象方法
  • 测试环境建议开启WP_DEBUG调试模式,这类非对象调用方法的致命错误会直接输出提示,能大幅提升排查效率

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 02:45:47