根据购物车页面的属性值和产品数量在 WooCommerce 中添加到购物车验证
Add to cart validation in WooCommerce based on attribute value and product quantity from the cart page
实际上,我正在尝试根据产品属性为某些产品 ID 设置添加到购物车的限制。
我所做的是:
add_action( 'woocommerce_add_to_cart_validation', 'max_add_to_cart', 10, 2 );
function max_add_to_cart( $cart_item_key, $product_id ) {
$product = wc_get_product( $product_id );
$maxqty = $product->get_attribute('quantite_max');
$nbcart = get_item_qty_cart($product_id);
if (!empty($maxqty) && $maxqty <= $nbcart) {
wc_add_notice("cant have more than " . " {$maxqty} x {$product->get_title()} in cart.", 'error');
return false;
}
return true;
}
循环运行,但在产品页面上,它没有考虑数量输入。
有没有办法在我的函数中获取数量添加输入?
woocommerce_add_to_cart_validation
包含5个参数(后2个可选)
$passed
= return 默认为真
$product_id
= 产品 ID,这使您可以访问 wc_get_product( $product_id )
以获取产品对象
$quantity
= 您要添加到购物车的当前数量
get_item_qty_cart
似乎不存在于您的代码中
通过在我的回答中添加评论标签进行解释
所以你得到:
function filter_woocommerce_add_to_cart_validation( $passed, $product_id, $quantity, $variation_id = null, $variations = null ) {
// Get product object
$product = wc_get_product( $product_id );
// Flag
$flag = false;
// Is a WC product
if ( is_a( $product, 'WC_Product' ) ) {
// Get the product attribute value
$max_qty = $product->get_attribute( 'quantite_max' );
// NOT empty
if ( ! empty( $max_qty ) ) {
// If new added quantity greater than max quantity
if ( $quantity > $max_qty ) {
$flag = true;
// WC Cart NOT null & Cart is NOT empty
} elseif ( ! is_null( WC()->cart ) && ! WC()->cart->is_empty() ) {
// Get cart items quantities
$cart_item_quantities = WC()->cart->get_cart_item_quantities();
// Product quantity in cart
$product_qty_in_cart = isset( $cart_item_quantities[ $product_id ] ) ? $cart_item_quantities[ $product_id ] : null;
// New added quantity + product quantity in cart greater than max quantity
if ( ( $quantity + $product_qty_in_cart ) > $max_qty ) {
$flag = true;
}
}
}
}
// True
if ( $flag ) {
wc_add_notice( sprintf( __( 'Cant have more than %s x %s in cart', 'woocommerce' ), $max_qty, $product->get_name() ), 'error' );
$passed = false;
}
return $passed;
}
add_filter( 'woocommerce_add_to_cart_validation', 'filter_woocommerce_add_to_cart_validation', 10, 5 );
实际上,我正在尝试根据产品属性为某些产品 ID 设置添加到购物车的限制。
我所做的是:
add_action( 'woocommerce_add_to_cart_validation', 'max_add_to_cart', 10, 2 );
function max_add_to_cart( $cart_item_key, $product_id ) {
$product = wc_get_product( $product_id );
$maxqty = $product->get_attribute('quantite_max');
$nbcart = get_item_qty_cart($product_id);
if (!empty($maxqty) && $maxqty <= $nbcart) {
wc_add_notice("cant have more than " . " {$maxqty} x {$product->get_title()} in cart.", 'error');
return false;
}
return true;
}
循环运行,但在产品页面上,它没有考虑数量输入。
有没有办法在我的函数中获取数量添加输入?
woocommerce_add_to_cart_validation
包含5个参数(后2个可选)$passed
= return 默认为真$product_id
= 产品 ID,这使您可以访问wc_get_product( $product_id )
以获取产品对象$quantity
= 您要添加到购物车的当前数量
get_item_qty_cart
似乎不存在于您的代码中通过在我的回答中添加评论标签进行解释
所以你得到:
function filter_woocommerce_add_to_cart_validation( $passed, $product_id, $quantity, $variation_id = null, $variations = null ) {
// Get product object
$product = wc_get_product( $product_id );
// Flag
$flag = false;
// Is a WC product
if ( is_a( $product, 'WC_Product' ) ) {
// Get the product attribute value
$max_qty = $product->get_attribute( 'quantite_max' );
// NOT empty
if ( ! empty( $max_qty ) ) {
// If new added quantity greater than max quantity
if ( $quantity > $max_qty ) {
$flag = true;
// WC Cart NOT null & Cart is NOT empty
} elseif ( ! is_null( WC()->cart ) && ! WC()->cart->is_empty() ) {
// Get cart items quantities
$cart_item_quantities = WC()->cart->get_cart_item_quantities();
// Product quantity in cart
$product_qty_in_cart = isset( $cart_item_quantities[ $product_id ] ) ? $cart_item_quantities[ $product_id ] : null;
// New added quantity + product quantity in cart greater than max quantity
if ( ( $quantity + $product_qty_in_cart ) > $max_qty ) {
$flag = true;
}
}
}
}
// True
if ( $flag ) {
wc_add_notice( sprintf( __( 'Cant have more than %s x %s in cart', 'woocommerce' ), $max_qty, $product->get_name() ), 'error' );
$passed = false;
}
return $passed;
}
add_filter( 'woocommerce_add_to_cart_validation', 'filter_woocommerce_add_to_cart_validation', 10, 5 );