WooCommerce自定义评价标签替换为Bazaarvoice时global $product失效问题
问题修复方案
你代码的核心错误有3处:
- 多余挂载了
add_action( 'woocommerce_product_tabs', ' bv_reviews_tab' ),你已经在过滤器中指定了评价tab的回调函数,不需要额外挂载动作,直接删除这行即可 - 依赖
global $product取值不稳定,WooCommerce的Tab回调函数会默认传入当前产品对象,直接通过函数参数接收即可,无需调用全局变量 - 可变产品循环中每次覆盖
$model变量,最终只会拿到最后一个变体的型号,这里优先调整为取主产品的型号,你可以根据自身业务逻辑调整取值规则
修正后完整代码
add_filter( 'woocommerce_product_tabs', 'woo_renam_tabs', 98 ); function woo_renam_tabs( $tabs ) { $tabs['additional_information']['title'] = __( 'Product Data' ); // 重命名额外信息tab $tabs['additional_information']['callback'] = 'woocommerce_product_additional_information_tab'; $tabs['reviews']['callback'] = 'bv_reviews_tab'; // 指定评价tab的自定义回调 return $tabs; } // 自定义评价tab回调,直接接收产品对象参数 function bv_reviews_tab( $product ) { $model = ''; // 优先取主产品的型号 $main_model = esc_attr( get_post_meta( $product->get_id(), '_model_number', true ) ); if ( !empty($main_model) ) { $model = $main_model; } elseif ( $product->is_type('simple' ) ) { $model = esc_attr( get_post_meta( $product->get_id(), '_model_number', true ) ); } elseif ( $product->is_type('variable' ) ) { // 取第一个有值的变体型号,你可以根据需求调整为取全部/指定变体的逻辑 $children_ids = $product->get_children(); foreach ( $children_ids as $child_id ) { $child_model = esc_attr( get_post_meta( $child_id, '_model_number', true ) ); if ( !empty($child_model) ) { $model = $child_model; break; } } } // 只有型号存在时输出Bazaarvoice容器 if ( !empty($model) ) : ?> <div data-bv-show="reviews" data-bv-product-id="<?php echo $model; ?>"></div> <?php endif; }
代码说明
- 完全移除了对
global $product的依赖,直接通过回调参数拿到产品对象,不会再出现取值失效的问题 - 新增了型号的非空判断,避免出现空值传入Bazaarvoice的异常
- 可变产品的型号取值逻辑调整为优先取主产品型号,再取首个有值的变体型号,你可以根据自身Bazaarvoice的配置规则修改这部分逻辑
内容的提问来源于stack exchange,提问作者user2514575
相关产品推荐
相关产品推荐

