基于产品标签与变体修改WooCommerce库存文本的问题求助
问题分析
- 标签判断逻辑错误:原代码中
has_term()未传入产品ID,处理变体产品时会默认使用全局$post对象,而变体产品的标签通常继承自父变量产品,导致标签匹配不准确。 - 多标签文本覆盖:多个独立的
if语句会让同时带有多个目标标签的产品,被最后一个匹配的标签覆盖文本,比如同时带1101和1104标签时,最终显示1104对应的文本。 - 场景缺失:未处理无库存及预售(back-orders)场景的文本自定义。
修正后的代码
add_filter( 'woocommerce_get_availability_text', 'woo_custom_stock_availability_text', 99, 2 ); function woo_custom_stock_availability_text( $availability, $product ) { // 获取正确的产品ID:变体产品取父产品ID,简单产品取自身ID $product_id = $product->is_type('variation') ? $product->get_parent_id() : $product->get_id(); // 定义标签ID与对应文本的映射,键为标签ID,值为包含库存、无库存文本的数组 $tag_text_map = [ 1100 => [ 'in_stock' => 'Voorraad: ' . $product->get_stock_quantity() . ' stuks. Verwachte levertijd 20 t/m 25 werkdagen voor chroom, 40 t/m 60 werkdagen voor kleur.', 'out_of_stock' => 'Niet op voorraad, levertijd 20 tot 25 werkdagen.' ], 1101 => [ 'in_stock' => 'Voorraad: ' . $product->get_stock_quantity() . ' stuks. Verwachte levertijd 20 t/m 25 werkdagen voor chroom, 40 t/m 60 werkdagen voor kleur.', 'out_of_stock' => 'Niet op voorraad, levertijd 20 tot 25 werkdagen.' ], 1102 => [ 'in_stock' => 'Voorraad: ' . $product->get_stock_quantity() . ' stuks. Verwachte levertijd 20 t/m 25 werkdagen voor chroom, 40 t/m 60 werkdagen voor Mat-zwart.', 'out_of_stock' => 'Niet op voorraad, levertijd 20 tot 25 werkdagen.' ], 1103 => [ 'in_stock' => 'Voorraad: ' . $product->get_stock_quantity() . ' stuks. Verwachte levertijd 1 t/m 5 werkdagen.', 'out_of_stock' => 'Niet op voorraad, levertijd 1 tot 5 werkdagen.' ], 1104 => [ 'in_stock' => 'Voorraad: ' . $product->get_stock_quantity() . ' stuks. Verwachte levertijd 4 t/m 7 werkdagen.', 'out_of_stock' => 'Niet op voorraad, levertijd 4 tot 7 werkdagen.' ], 1105 => [ 'in_stock' => 'Voorraad: ' . $product->get_stock_quantity() . ' stuks. Verwachte levertijd 7 t/m 14 werkdagen.', 'out_of_stock' => 'Niet op voorraad, levertijd 7 tot 14 werkdagen.' ], 1106 => [ 'in_stock' => 'Voorraad: ' . $product->get_stock_quantity() . ' stuks. Verwachte levertijd 3 tot 5 weken.', 'out_of_stock' => 'Niet op voorraad, levertijd 3 tot 5 weken.' ], 1107 => [ 'in_stock' => 'Voorraad: ' . $product->get_stock_quantity() . ' stuks. Verwachte levertijd 8 tot 12 weken.', 'out_of_stock' => 'Niet op voorraad, levertijd 8 tot 12 weken.' ] ]; // 遍历标签映射,找到第一个匹配的标签后立即退出 foreach ( $tag_text_map as $tag_id => $texts ) { if ( has_term( $tag_id, 'product_tag', $product_id ) ) { if ( $product->is_in_stock() && $product->managing_stock() ) { $availability = $texts['in_stock']; } else { // 统一处理无库存及预售场景 $availability = $texts['out_of_stock']; } break; } } return $availability; }
代码说明
- 标签判断准确:自动识别变体产品,使用父产品ID检查标签,避免全局上下文导致的判断错误。
- 避免文本覆盖:遍历匹配到第一个标签后立即退出循环,解决多标签场景下的文本覆盖问题。
- 易维护性:用数组集中管理标签与对应文本,后续修改或新增标签只需更新数组即可。
- 全场景覆盖:处理了有库存、无库存及预售场景的文本自定义,符合需求。
内容的提问来源于stack exchange,提问作者René R
相关产品推荐
相关产品推荐

