因此,我几乎实现了我的目标——如果客户的购物车中有另一种特定产品,则为特定产品创建新的折扣价格。
我正在使用ACF来选择核心产品和折扣产品,这些都很好。问题在于产品添加到购物车的顺序。
如果我在核心产品之前加上折扣产品,折扣产品将正确调整为9.99美元(ACF确定的新价格(。然而,如果我先添加核心产品,然后添加应该打折的产品,价格保持不变——没有折扣。
我使用此代码作为参考:https://stackoverflow.com/a/47500323/16291715
我的代码:
add_action( 'woocommerce_before_calculate_totals', 'boga_discount', 20, 1 );
function boga_discount( $cart ) {
if (is_admin() && !defined('DOING_AJAX'))
return;
if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
return;
// First loop to check if CORE product is in cart
foreach ( $cart->get_cart() as $cart_item ){
$is_in_cart = $cart_item['product_id'] == 1249 ? true : false;
}
// Second loop change prices
foreach ( $cart->get_cart() as $cart_item ) {
// Get an instance of the WC_Product object (or the variation product object)
$product = $cart_item['data'];
// Here we target DISCOUNT ID 17
if( $product->get_id() == 1361 ) {
// GET THE NEW PRICE
$new_price = 9.99; // <== Add your code HERE
// When product CORE product is in cart
if( $is_in_cart ){
$product->set_price( $new_price );
}
}
}
}
我不明白为什么这会发生在我的一生中,但我确信我遗漏了一些小细节。
在第一个循环中,您有
$is_in_cart = $cart_item['product_id'] == 813 ? true : false;
假设推车813&813中有2个产品;815.
在遍历购物车项目(第一个循环(时,假设首先找到产品813,因此$is_in_cart
为真。然而,在同一循环中,$cart_item['product_id']
现在等于815。条件再说一遍,等于813?这不匹配,因此$is_in_cart
将为false。这就是的问题
所以你不需要使用2个foreach循环,这就足够了:
function action_woocommerce_before_calculate_totals( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
return;
// Settings
$core_product = 813;
$discounted_product = 815;
$new_price = 9.99;
// Initialize
$flag_core_product = false;
$flag_discounted_product = false;
// Loop through cart items
foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
// Compare
if ( $cart_item['product_id'] == $core_product ) {
$flag_core_product = true;
} elseif ( $cart_item['product_id'] == $discounted_product ) {
$flag_discounted_product = true;
// Store data (discounted product)
$cart_item_data = $cart_item['data'];
}
}
// Both are true
if ( $flag_core_product && $flag_discounted_product ) {
// Set new price
$cart_item_data->set_price( $new_price );
}
}
add_action( 'woocommerce_before_calculate_totals', 'action_woocommerce_before_calculate_totals', 10, 1 );