根据产品类别有条件地操作 WooCommerce 购物车项目
Manipulating WooCommerce cart items conditionally based on product categories
我正在使用 WooCommerce 创建一个在线食品配送网站,需要创建一个 "Make it a Meal" 类型的追加销售供客户购买。
我创建了一个名为 "Make it a Meal" 的单一产品,用户可以在其中 select 他们选择的饮料和配菜(使用变体)。然而,我需要的是每顿主餐只能购买其中一种产品。
示例:
- "Main Meal" 类别中的产品已添加到购物车
- 然后用户可以将 "Make it a Meal" 产品添加到购物车
- 用户不能添加第二个 "Make it a Meal" 产品,除非他们有来自 "Meal Meal" 类别的第二个产品,即每个产品只有一个
- 如果 "Main Meal" 产品已从购物车中移除,则 "Make it a Meal" 也会被移除。
有没有人实现过这种功能?我尝试了各种插件,但目前没有成功。
更新:
可以先检查添加到购物车事件(可选择显示错误通知):
add_filter( 'woocommerce_add_to_cart_validation', 'checking_products_added_to_cart', 10, 3 );
function checking_products_added_to_cart( $passed, $product_id, $quantity) {
$cat_add = 'Make it a Meal';
$cat_src = 'Main Meal';
if(has_term( $cat_add, 'product_cat', $product_id )):
$main_meal_count = 0;
$make_it_a_meal_count = 0;
foreach (WC()->cart->get_cart() as $cart_item ){
// Counting 'Main Meal' products in cart (with quantity)
if( has_term( $cat_src, 'product_cat', $cart_item['product_id'] ))
$main_meal_count += $cart_item['quantity'];
// Counting 'Make it a Meal' products in cart (with quantity)
if( has_term( $cat_add, 'product_cat', $cart_item['product_id'] ))
$make_it_a_meal_count += $cart_item['quantity'];
}
if( $main_meal_count < ($make_it_a_meal_count + $quantity) ) {
$passed = false;
// Displaying a message (optionnal)
wc_add_notice( 'my custom error message…', 'error' );
}
endif;
return $passed;
}
然后您还需要检查何时更改购物车数量或移除购物车商品:
add_action( 'woocommerce_calculate_totals', 'check_removed_cart_items', 10, 1);
function check_removed_cart_items( $cart_object ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
$cat_add = 'Make it a Meal';
$cat_src = 'Main Meal';
$main_meal_count = 0;
$make_it_a_meal_count = 0;
// First loop: Counting cart items 'Main Meal' and 'Make it a Meal'
foreach ($cart_object->get_cart() as $item_values ){
// Counting 'Main Meal' products in cart (with quantity)
if( has_term( $cat_src, 'product_cat', $item_values['product_id'] ))
$main_meal_count += $item_values['quantity'];
// Counting 'Make it a Meal' products in cart (with quantity)
if( has_term( $cat_add, 'product_cat', $item_values['product_id'] )){
$make_it_a_meal_count += $item_values['quantity'];
}
}
$difference = intval($make_it_a_meal_count - $main_meal_count);
echo '<p>$main_meal_count is '.$main_meal_count.'</p>';
echo '<p>$make_it_a_meal_count is '.$make_it_a_meal_count.'</p>';
echo '<p>$difference is '.$difference.'</p>';
if( $main_meal_count < $make_it_a_meal_count ) {
echo '<p>case1</p>';
// Second Loop: Make necessary actions
foreach ($cart_object->get_cart() as $cart_item_key => $cart_item ){
// Targeting 'Make it a Meal'
if( has_term( $cat_add, 'product_cat', $cart_item['product_id'] )){
$item_qty = intval( $cart_item['quantity'] );
if( $item_qty == 1 && $difference == 1 ){
$cart_object->remove_cart_item($cart_item_key);
break;
} else {
if( $item_qty > 1 && $difference <= $item_qty ){
$cart_object->set_quantity( $cart_item_key, ($item_qty - $difference) );
break;
} else {
$cart_object->remove_cart_item($cart_item_key);
}
}
}
}
}
}
有了这 2 个挂钩函数,您就有了一个完整的解决方案。
代码进入您的活动子主题(或主题)的 function.php 文件或任何插件文件。
此代码已经过测试并且有效。
我正在使用 WooCommerce 创建一个在线食品配送网站,需要创建一个 "Make it a Meal" 类型的追加销售供客户购买。
我创建了一个名为 "Make it a Meal" 的单一产品,用户可以在其中 select 他们选择的饮料和配菜(使用变体)。然而,我需要的是每顿主餐只能购买其中一种产品。
示例:
- "Main Meal" 类别中的产品已添加到购物车
- 然后用户可以将 "Make it a Meal" 产品添加到购物车
- 用户不能添加第二个 "Make it a Meal" 产品,除非他们有来自 "Meal Meal" 类别的第二个产品,即每个产品只有一个
- 如果 "Main Meal" 产品已从购物车中移除,则 "Make it a Meal" 也会被移除。
有没有人实现过这种功能?我尝试了各种插件,但目前没有成功。
更新:
可以先检查添加到购物车事件(可选择显示错误通知):
add_filter( 'woocommerce_add_to_cart_validation', 'checking_products_added_to_cart', 10, 3 );
function checking_products_added_to_cart( $passed, $product_id, $quantity) {
$cat_add = 'Make it a Meal';
$cat_src = 'Main Meal';
if(has_term( $cat_add, 'product_cat', $product_id )):
$main_meal_count = 0;
$make_it_a_meal_count = 0;
foreach (WC()->cart->get_cart() as $cart_item ){
// Counting 'Main Meal' products in cart (with quantity)
if( has_term( $cat_src, 'product_cat', $cart_item['product_id'] ))
$main_meal_count += $cart_item['quantity'];
// Counting 'Make it a Meal' products in cart (with quantity)
if( has_term( $cat_add, 'product_cat', $cart_item['product_id'] ))
$make_it_a_meal_count += $cart_item['quantity'];
}
if( $main_meal_count < ($make_it_a_meal_count + $quantity) ) {
$passed = false;
// Displaying a message (optionnal)
wc_add_notice( 'my custom error message…', 'error' );
}
endif;
return $passed;
}
然后您还需要检查何时更改购物车数量或移除购物车商品:
add_action( 'woocommerce_calculate_totals', 'check_removed_cart_items', 10, 1);
function check_removed_cart_items( $cart_object ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
$cat_add = 'Make it a Meal';
$cat_src = 'Main Meal';
$main_meal_count = 0;
$make_it_a_meal_count = 0;
// First loop: Counting cart items 'Main Meal' and 'Make it a Meal'
foreach ($cart_object->get_cart() as $item_values ){
// Counting 'Main Meal' products in cart (with quantity)
if( has_term( $cat_src, 'product_cat', $item_values['product_id'] ))
$main_meal_count += $item_values['quantity'];
// Counting 'Make it a Meal' products in cart (with quantity)
if( has_term( $cat_add, 'product_cat', $item_values['product_id'] )){
$make_it_a_meal_count += $item_values['quantity'];
}
}
$difference = intval($make_it_a_meal_count - $main_meal_count);
echo '<p>$main_meal_count is '.$main_meal_count.'</p>';
echo '<p>$make_it_a_meal_count is '.$make_it_a_meal_count.'</p>';
echo '<p>$difference is '.$difference.'</p>';
if( $main_meal_count < $make_it_a_meal_count ) {
echo '<p>case1</p>';
// Second Loop: Make necessary actions
foreach ($cart_object->get_cart() as $cart_item_key => $cart_item ){
// Targeting 'Make it a Meal'
if( has_term( $cat_add, 'product_cat', $cart_item['product_id'] )){
$item_qty = intval( $cart_item['quantity'] );
if( $item_qty == 1 && $difference == 1 ){
$cart_object->remove_cart_item($cart_item_key);
break;
} else {
if( $item_qty > 1 && $difference <= $item_qty ){
$cart_object->set_quantity( $cart_item_key, ($item_qty - $difference) );
break;
} else {
$cart_object->remove_cart_item($cart_item_key);
}
}
}
}
}
}
有了这 2 个挂钩函数,您就有了一个完整的解决方案。
代码进入您的活动子主题(或主题)的 function.php 文件或任何插件文件。
此代码已经过测试并且有效。