WooCommerce可变商品缺货预订自定义过滤器失效问题求助
问题排查:WooCommerce可变商品上缺货预订过滤器失效
嘿,我来帮你捋捋这个可变商品过滤器失效的问题,结合WooCommerce的机制和你的代码,核心问题大概率出在变体的元数据获取逻辑上,主要有这几个可能的原因和解决办法:
1. 你拿错了元数据的存储对象
可变商品的每个变体都是独立的post对象,如果你把_supplier_stock字段存在**主可变商品(父产品)**的元数据里,那用变体ID去调用get_post_meta()肯定拿不到有效值——因为变体自己的meta里根本没有这个字段,自然触发不了后续的条件判断。
解决办法:先判断当前产品是不是变体,如果是,就取父产品的ID来获取元数据:
// 替换原有的$supplier_stock获取逻辑 $target_id = $product->is_type('variation') ? $product->get_parent_id() : $product->get_id(); $supplier_stock = get_post_meta( $target_id, '_supplier_stock', true );
2. 数组索引的逻辑不匹配变体场景
你代码里用$supplier_stock[$product->get_id()]来取数组值,这个逻辑在简单商品上没问题,但变体场景下要注意:
- 如果
_supplier_stock数组的键是变体ID,那这个逻辑是对的,但前提是你已经拿到了父产品的meta数组; - 如果数组的键是父产品ID或者其他值,那这里就会取不到正确的库存数。
解决办法:先加个存在性判断,避免报错,同时确保索引正确:
if(is_array($supplier_stock)) { // 只有当数组里存在当前产品ID的键时才取值,否则设为0 $supplier_stock = isset($supplier_stock[$product->get_id()]) ? $supplier_stock[$product->get_id()] : 0; }
3. 过滤器优先级被覆盖
你设置了优先级0,虽然已经很高,但不排除有其他插件/主题的同名过滤器用了更高优先级(比如负数),在你之后修改了缺货预订状态,覆盖了你的设置。
解决办法:把优先级调得更高,比如-10:
// 修改钩子的优先级参数 add_filter('woocommerce_product_get_backorders','filter_woocommerce_product_get_backorders', -10, 2 ); add_filter('woocommerce_product_variation_get_backorders', 'filter_woocommerce_product_get_backorders', -10, 2);
修改后的完整代码
结合上面的优化,最终代码如下:
/* Supplier stock levels backorders allowed if there is supplier stock */ add_filter('woocommerce_product_get_backorders','filter_woocommerce_product_get_backorders', -10, 2 ); add_filter('woocommerce_product_variation_get_backorders', 'filter_woocommerce_product_get_backorders', -10, 2); function filter_woocommerce_product_get_backorders( $backorders_status, $product ){ // 获取正确的产品ID(变体取父产品ID) $target_id = $product->is_type('variation') ? $product->get_parent_id() : $product->get_id(); $supplier_stock = get_post_meta( $target_id, '_supplier_stock', true ); // 处理数组格式的库存值,加存在性判断避免报错 if(is_array($supplier_stock)) { $supplier_stock = isset($supplier_stock[$product->get_id()]) ? $supplier_stock[$product->get_id()] : 0; } // 检查库存是否大于0,修改缺货预订状态 if ( ! empty( $supplier_stock ) && $supplier_stock > 0 ) { $backorders_status = 'notify'; } return $backorders_status; }
调试小技巧
如果还是有问题,可以在函数里加调试日志,看看变体场景下到底拿到了什么值:
// 仅调试用,上线前删除 if($product->is_type('variation')) { error_log('变体ID:'.$product->get_id().',父产品ID:'.$product->get_parent_id()); error_log('获取的supplier_stock:'.print_r($supplier_stock, true)); }
然后去WordPress的wp-content/debug.log里看日志,就能清楚知道哪里出问题了。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

