Woocommerce:如何在购物车中只允许一种产品类型?
Woocommerce: How to allow only one product type in a cart?
我有两种产品类型,一种是简单产品 $cart_item['default-engraving']
,另一种是信用产品 $cart_item['default-engraving'] && $cart_item['iconic-engraving']
。我正在尝试找到一种解决方案,如果我将简单产品添加到购物车,则不应添加信用产品。或者,如果我将信用产品添加到购物车,则不应添加简单产品。但是,如果我愿意,我可以添加任意数量的相同类型,例如简单的产品类型。
你可以试试这个
add_filter( 'woocommerce_add_to_cart_validation', 'only_one_product_category_allowed', 20, 3 );
function only_one_product_category_allowed( $passed, $product_id, $quantity) {
// Getting the product categories term slugs in an array for the current product
$term_slugs = wp_get_post_terms( $product_id, 'product_cat', array('fields' => 'slugs') );
// Loop through cart items
foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item ){
// Check if the product category of the current product don't match with a cart item
$_product = wc_get_product( $cart_item['product_id']; );
if( $_product->is_type( 'simple' ) ) {
// code to not allow other product type
} else {
// do stuff for everything else
}
}
}
更新:无法在添加到购物车事件中检测自定义购物车项目数据。
检查购物车商品可以防止购物车商品同时包含 $cart_item['default-engraving']
和 $cart_item['iconic-engraving']
:
add_action( 'woocommerce_check_cart_items', 'check_cart_items_custom_data' );
function check_cart_items_custom_data() {
// Initializing: set the current product type in an array
$types = [];
// Loop through cart items
foreach (WC()->cart->get_cart() as $item ){
if( isset( $item['default-engraving'] ) )
$types[] = 'default';
if( isset( $item['iconic-engraving'] ) )
$types[] = 'iconic';
}
$types = array_unique( $types );
// Check the number of product types allowing only one
if( count( $types ) > 1 ){
// Displaying a custom notice and avoid checkout
wc_add_notice( __('Only items from one product type are allowed in cart'), 'error' );
}
}
代码进入活动子主题(或活动主题)的 functions.php 文件。 已测试并有效。
原始答案:(它不适用于您的情况,因为无法在添加到购物车事件中检测到它)
以下是定位产品类型以仅允许购物车中的一种方式:
add_filter( 'woocommerce_add_to_cart_validation', 'only_one_product_type_allowed', 10, 3 );
function only_one_product_type_allowed( $passed, $product_id, $quantity ) {
// Initializing: set the current product type in an array
$types = [ wc_get_product( $product_id )->get_type() ];
// Loop through cart items
foreach (WC()->cart->get_cart() as $item ){
// Set each product type in the array
$types[] = wc_get_product( $item['product_id'] )->get_type();
}
$types = array_unique( $types );
// Check the number of product types allowing only one
if( count( $types ) > 1 ){
// Displaying a custom notice
wc_add_notice( __('Only items from one product type are allowed in cart'), 'error' );
return false; // Avoid add to cart
}
return $passed;
}
代码进入活动子主题(或活动主题)的 functions.php 文件。 已测试并有效。
相关:
请检查下面的代码。
<?php
function ji_woocommerce_add_to_cart_validation( $valid, $product_id, $quantity )
{
$_product = wc_get_product( $product_id);
foreach (WC()->cart->get_cart() as $item ){
$checkTypes[] = wc_get_product( $item['product_id'] )->get_type();
}
$checkTypes = array_unique( $types );
if(count($checkTypes) > 0)
{
if(!in_array($_product->get_type(),$checkTypes))
{
wc_add_notice( __('Here you can add your error message','textdomain'), 'error' );
return false;
}
}
return $valid;
}
add_filter( 'woocommerce_add_to_cart_validation', 'ji_woocommerce_add_to_cart_validation', 10, 3 );
?>
我有两种产品类型,一种是简单产品 $cart_item['default-engraving']
,另一种是信用产品 $cart_item['default-engraving'] && $cart_item['iconic-engraving']
。我正在尝试找到一种解决方案,如果我将简单产品添加到购物车,则不应添加信用产品。或者,如果我将信用产品添加到购物车,则不应添加简单产品。但是,如果我愿意,我可以添加任意数量的相同类型,例如简单的产品类型。
你可以试试这个
add_filter( 'woocommerce_add_to_cart_validation', 'only_one_product_category_allowed', 20, 3 );
function only_one_product_category_allowed( $passed, $product_id, $quantity) {
// Getting the product categories term slugs in an array for the current product
$term_slugs = wp_get_post_terms( $product_id, 'product_cat', array('fields' => 'slugs') );
// Loop through cart items
foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item ){
// Check if the product category of the current product don't match with a cart item
$_product = wc_get_product( $cart_item['product_id']; );
if( $_product->is_type( 'simple' ) ) {
// code to not allow other product type
} else {
// do stuff for everything else
}
}
}
更新:无法在添加到购物车事件中检测自定义购物车项目数据。
检查购物车商品可以防止购物车商品同时包含 $cart_item['default-engraving']
和 $cart_item['iconic-engraving']
:
add_action( 'woocommerce_check_cart_items', 'check_cart_items_custom_data' );
function check_cart_items_custom_data() {
// Initializing: set the current product type in an array
$types = [];
// Loop through cart items
foreach (WC()->cart->get_cart() as $item ){
if( isset( $item['default-engraving'] ) )
$types[] = 'default';
if( isset( $item['iconic-engraving'] ) )
$types[] = 'iconic';
}
$types = array_unique( $types );
// Check the number of product types allowing only one
if( count( $types ) > 1 ){
// Displaying a custom notice and avoid checkout
wc_add_notice( __('Only items from one product type are allowed in cart'), 'error' );
}
}
代码进入活动子主题(或活动主题)的 functions.php 文件。 已测试并有效。
原始答案:(它不适用于您的情况,因为无法在添加到购物车事件中检测到它)
以下是定位产品类型以仅允许购物车中的一种方式:
add_filter( 'woocommerce_add_to_cart_validation', 'only_one_product_type_allowed', 10, 3 );
function only_one_product_type_allowed( $passed, $product_id, $quantity ) {
// Initializing: set the current product type in an array
$types = [ wc_get_product( $product_id )->get_type() ];
// Loop through cart items
foreach (WC()->cart->get_cart() as $item ){
// Set each product type in the array
$types[] = wc_get_product( $item['product_id'] )->get_type();
}
$types = array_unique( $types );
// Check the number of product types allowing only one
if( count( $types ) > 1 ){
// Displaying a custom notice
wc_add_notice( __('Only items from one product type are allowed in cart'), 'error' );
return false; // Avoid add to cart
}
return $passed;
}
代码进入活动子主题(或活动主题)的 functions.php 文件。 已测试并有效。
相关:
请检查下面的代码。
<?php
function ji_woocommerce_add_to_cart_validation( $valid, $product_id, $quantity )
{
$_product = wc_get_product( $product_id);
foreach (WC()->cart->get_cart() as $item ){
$checkTypes[] = wc_get_product( $item['product_id'] )->get_type();
}
$checkTypes = array_unique( $types );
if(count($checkTypes) > 0)
{
if(!in_array($_product->get_type(),$checkTypes))
{
wc_add_notice( __('Here you can add your error message','textdomain'), 'error' );
return false;
}
}
return $valid;
}
add_filter( 'woocommerce_add_to_cart_validation', 'ji_woocommerce_add_to_cart_validation', 10, 3 );
?>