如何在woocommerce_add_to_cart钩子中正确获取加入购物车的产品ID?
解决WooCommerce加入购物车时获取产品ID失败的问题
核心问题
你用错了woocommerce_add_to_cart钩子的参数——这个钩子的第一个参数不是产品对象,而是购物车项的键($cart_item_key,字符串类型)。所以你代码里的$product->ID根本取不到正确的产品ID,导致SQL查询返回空数组。
修正步骤
- 调整钩子的参数数量:
woocommerce_add_to_cart钩子总共有6个可用参数,你需要把add_action的第四个参数改成6,这样才能接收正确的产品ID。 - 修改函数参数接收:直接获取钩子传递的
$product_id(第二个参数),这就是当前加入购物车的产品ID。
修正后的完整代码
add_action( 'woocommerce_add_to_cart', 'wiz_stock_deduct', 10, 6 ); function wiz_stock_deduct( $cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data ) { // 直接使用钩子传递的产品ID $thispost_id = $product_id; // 如果你需要产品对象,可以用下面的代码获取 // $product = wc_get_product( $thispost_id ); // 获取关联产品及数量 $parts = wiz_checkpoststock( $thispost_id ); if ( $parts ) { // 注意:如果用户一次加入多个当前产品,需要按加入数量乘以关联产品的扣减数量 $multiplier = $quantity; foreach( $parts as $part ) { $part_id = $part[0]; $part_quant = $part[1] * $multiplier; // 扣减关联产品库存 wc_update_product_stock( $part_id, $part_quant, 'decrease', false ); } } }
额外注意事项
- 我在代码里加了
$multiplier = $quantity,因为如果用户一次加入多个ID=13的产品(比如加2个),关联产品的库存应该按比例扣减(比如ID=14扣5*2=10),你原来的代码只扣了固定数量,这可能不符合需求。 - 确认
wiz_checkpoststock函数接收的是数字类型的ID,避免类型不匹配导致查询失败。
内容的提问来源于stack exchange,提问作者mrslope
相关产品推荐
相关产品推荐

