如何判断WooCommerce捆绑产品是否包含可选捆绑商品?
WooCommerce捆绑产品判断可选商品并替换输出为添加按钮
需求说明
需要检查WooCommerce产品页面是否为捆绑产品,若为捆绑产品则判断是否存在至少一个可选捆绑商品:
- 存在可选商品时设置
$hasqty = 1 - 不存在时设置
$hasqty = 0 - 最终将测试用的输出文本替换为添加到购物车按钮
最初代码的问题
最初的实现存在几个关键错误:
- 变量名不一致:定义了
$bundleditems但循环里用了$bundled_items,导致循环无法执行 is_optional()方法传参错误:插件源码里该方法无参数,直接返回'yes' === $this->optional- 循环逻辑错误:每次循环都会覆盖
$hasqty的值,无法正确统计是否存在至少一个可选商品
修正后的基础判断代码
调整后的代码已能正确判断是否存在可选捆绑商品:
add_action( 'woocommerce_before_add_to_cart_form', 'ino_qty_main_function' ); function ino_qty_main_function() { global $product; if ( $product->is_type('bundle') ) { $hasqty = 0; $bundleditems = $product->get_bundled_items(); foreach ( $bundleditems as $bundleditem ) { // is_optional方法无需传参,直接调用 if ( $bundleditem->is_optional() ) { $hasqty = 1; // 只要有一个可选商品就设为1,无需累加 break; // 找到一个后直接跳出循环,提升效率 } } // 原测试输出 echo "<h2> final hasqty" . $hasqty . "</h2>"; } }
注:这里把
$hasqty++改为直接赋值1并跳出循环,因为我们只需要判断是否至少存在一个可选商品,不需要统计数量,这样更高效。
替换测试输出为添加按钮
将测试输出替换为自定义添加按钮(或调用WooCommerce默认添加按钮),以下是完整代码:
add_action( 'woocommerce_before_add_to_cart_form', 'ino_qty_main_function' ); function ino_qty_main_function() { global $product; if ( $product->is_type('bundle') ) { $hasqty = 0; $bundleditems = $product->get_bundled_items(); foreach ( $bundleditems as $bundleditem ) { if ( $bundleditem->is_optional() ) { $hasqty = 1; break; } } // 替换测试输出为添加按钮 if ( $hasqty === 1 ) { // 有可选商品时显示的自定义按钮 echo '<button type="submit" class="single_add_to_cart_button button alt">添加可选套餐到购物车</button>'; } else { // 无可选商品时调用默认添加按钮 do_action( 'woocommerce_single_add_to_cart_button' ); // 也可以替换为自定义按钮: // echo '<button type="submit" class="single_add_to_cart_button button alt">添加套餐到购物车</button>'; } } }
说明:如果需要完全替换默认的添加到购物车表单,可先通过
remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart', 30 );移除默认按钮,避免重复显示。
内容的提问来源于stack exchange,提问作者Ino Ingvar
相关产品推荐
相关产品推荐

