WooCommerce商品联动增删代码同时启用后失效问题咨询
问题排查与解决方案
问题背景
我搭建了一个非WooCommerce的在线学习站点,商品A(ID67)是该站点的商品,商品B(ID15)是WooCommerce商品,使用WooCommerce购物车完成结账。原本找到两段代码,分别实现:
- 添加商品ID67时自动添加商品ID15
- 移除商品ID67时自动移除商品ID15
但将两段代码放在WPCode Snippet插件的两个独立片段中启用后,添加商品ID67时购物车中只有该商品,不会自动添加ID15。询问是否需要将两段代码合并,或是该方案本身不可行。
原有代码问题分析
- 语法错误:第二段代码的
jhall_remove_product_from_cart函数未闭合,缺少最后的},这会导致PHP语法错误,进而干扰所有WooCommerce相关钩子的执行,包括第一段代码的功能。 - 钩子选择不当:第一段代码使用
woocommerce_add_cart_item_data钩子,这个钩子在购物车项数据处理阶段触发,此时直接调用WC()->cart->add_to_cart()可能触发重复逻辑,导致添加商品的操作被打断。
修正方案
无需强制合并成一个片段,但必须修复代码错误并调整钩子逻辑,以下是修正后的代码(合并或分开管理均可,合并更便于维护):
合并后的完整代码
// 添加商品67时自动添加商品15 add_action( 'woocommerce_after_add_to_cart', 'auto_add_product_15_when_67_added' ); function auto_add_product_15_when_67_added() { // 获取当前添加的商品ID $product_id = isset( $_REQUEST['add-to-cart'] ) ? absint( $_REQUEST['add-to-cart'] ) : 0; if ( $product_id === 67 ) { // 检查商品15是否已在购物车中,避免重复添加 $found = false; foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) { if ( $cart_item['product_id'] === 15 ) { $found = true; break; } } if ( !$found ) { WC()->cart->add_to_cart( 15 ); } } } // 移除商品67时自动移除商品15 add_action( 'woocommerce_remove_cart_item', 'auto_remove_product_15_when_67_removed', 10, 2 ); function auto_remove_product_15_when_67_removed( $item_key, $cart ){ // 获取被移除的商品ID $removed_id = $cart->cart_contents[$item_key]['product_id']; if( $removed_id === 67 ){ // 查找商品15的购物车项并移除 foreach( $cart->get_cart() as $cart_item_key => $cart_item ){ if( $cart_item['product_id'] === 15 ){ $cart->remove_cart_item( $cart_item_key ); break; } } } }
关键修正点说明
- 替换
woocommerce_add_cart_item_data为woocommerce_after_add_to_cart钩子,确保商品67成功添加到购物车后,再执行添加商品15的操作,避免触发顺序冲突。 - 增加购物车商品检查逻辑,防止重复添加商品15。
- 修复第二段代码的语法错误,补充缺失的函数闭合
}。 - 改用遍历购物车的方式查找商品15,比
generate_cart_id更可靠,避免因商品属性差异导致无法匹配的问题。
执行建议
- 可以选择将两段代码合并为一个WPCode片段,便于统一管理和调试;也可以分开为两个片段,但需确保两段代码都无语法错误。
- 测试前请清空购物车,避免残留商品影响测试结果。
内容的提问来源于stack exchange,提问作者Sean McWard
相关产品推荐
相关产品推荐

