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
相关产品推荐
相关产品推荐

