WooCommerce中特定产品类别的最小购物车数量
在WooCommerce中,我对正在销售的产品使用出口"类别,并且我想为购买任何出口"产品的客户设置最低小计(30欧元).
In WooCommerce I use an OUTLET category with on sale products and I would like to set a minimum subtotal (30 €) for customers purchasing any "Outlet" product.
我试图将 woocommerce_after_calculate_totals
链接到:
- 检查特定商品类别的购物车商品
- 找到特定产品类别且订单价格低于30欧元时显示通知
- 并最终在用户尝试以低于30€的价格结帐时重定向到购物车页面.
这是我的代码:
add_action( 'woocommerce_after_calculate_totals', 'check_order_outlet_items', 10, 0 );
function check_order_outlet_items() {
global $woocommerce;
if (is_cart() || is_checkout()) {
// Check if cart contains items in Outlet cat.
$items = $woocommerce->cart->get_cart();
foreach($items as $item => $values) {
$product_id = $values['product_id'];
$terms = get_the_terms( $product_id, 'product_cat' );
foreach ($terms as $term) {
if ($term->name == "OUTLET") {
$outlet_found = 1;
break;
}
}
if ($outlet_found) {break;}
}
if ($outlet_found) {
// Calculate order amount including discount
$cart_subtotal = $woocommerce->cart->subtotal;
$discount_excl_tax_total = $woocommerce->cart->get_cart_discount_total();
$discount_tax_total = $woocommerce->cart->get_cart_discount_tax_total();
$discount_total = $discount_excl_tax_total + $discount_tax_total;
$order_net_amount = $cart_subtotal - $discount_total;
// Check if condition met
if ($order_net_amount < 30) {
if (is_checkout()) {
wp_redirect(WC()->cart->get_cart_url());
exit();
} else {
wc_add_notice( __( 'You must order at least 30 €', 'error' ) );
}
}
}
}
}
此代码可在购物车页面中完美运行(即使添加优惠券后,即使购物车金额低于30,也显示购物车的金额小于30的通知),并在用户想要结帐时重定向到购物车.
This code works perfectly in the cart page (displaying notice if cart's amount < 30 even if carts amount goes below 30 after adding a coupon) and redirecting to cart if users wants to go to checkout.
但是,如果我转到金额> = 30的结帐页面,然后添加优惠券(将购物车中的金额降低到30以下),则Ajax重新计算总数循环,该页面被阻止.但是,如果我重新加载了结帐页面,则可以正确地重定向到购物车页面.
But If I go to checkout page with an amount >= 30 and then add a coupon (to lower cart amount below 30), then the Ajax recalculating totals loops and the page is blocked. But then if I reload the checkout page I'm correctly redirected to cart page.
在这种情况下使用的正确方法是 woocommerce_check_cart_items
这样:
The right hook to be used in this case is woocommerce_check_cart_items
this way:
add_action( 'woocommerce_check_cart_items', 'check_cart_outlet_items' );
function check_cart_outlet_items() {
$categories = array('OUTLET'); // Defined targeted product categories
$threshold = 30; // Defined threshold amount
$cart = WC()->cart;
$cart_items = $cart->get_cart();
$subtotal = $cart->subtotal;
$subtotal -= $cart->get_cart_discount_total() + $cart->get_cart_discount_tax_total();
$found = false;
foreach( $cart_items as $cart_item_key => $cart_item ) {
// Check for specific product categories
if ( has_term( $categories, 'product_cat', $cart_item['product_id'] ) ) {
$found = true; // A category is found
break; // Stop the loop
}
}
if ( $found && $subtotal < $threshold ) {
// Display an error notice (and avoid checkout)
wc_add_notice( sprintf( __( "You must order at least %s" ), wc_price($threshold) ), 'error' );
}
}
代码进入您的活动子主题(或活动主题)的functions.php文件中.经过测试,可以正常工作.
Code goes in functions.php file of your active child theme (or active theme). Tested and works.