仅从一种自定义分类法限制购物车中的 WooCommerce 产品
Limit WooCommerce products in cart only from one custom taxonomy
我试图限制我的 Woocommerce 商店的客户一次只能从 1 个“供应商”订购产品。我通过称为“供应商”的自定义分类法定义“供应商”。我正在尝试的代码只是出于某种原因限制了所有内容。
function filter_woocommerce_add_to_cart_validation( $passed, $product_id, $quantity, $variation_id = null, $variations = null ) {
// If passed
if ( $passed ) {
// If cart is NOT empty when a product is added
if ( !WC()->cart->is_empty() ) {
// Set vars
$current_product_tag_ids = array();
$in_cart_product_tag_ids = array();
// Get current product categories via product_id
$current_product_tag_ids = wc_get_product_term_ids( $product_id, 'supplier' );
// Loop through cart items checking for product categories
foreach ( WC()->cart->get_cart() as $cart_item ) {
// Get product categories from product in cart via cart item product id
$in_cart_product_tag_ids = array_merge( $in_cart_product_tag_ids, wc_get_product_term_ids( $cart_item['product_id'], 'product_cat' ) );
}
// Removes duplicate values
$in_cart_product_tag_ids = array_unique( $in_cart_product_tag_ids, SORT_NUMERIC );
// Compare
$compare = array_diff( $current_product_tag_ids, $in_cart_product_tag_ids );
// Result is NOT empty
if ( !empty ( $compare ) ) {
wc_add_notice( 'This product is with a different supplier. Please only order from 1 supplier at a time.', 'error' );
$passed = false;
}
}
}
return $passed;
}
add_filter( 'woocommerce_add_to_cart_validation', 'filter_woocommerce_add_to_cart_validation', 10, 5 );
我并不是想将每个供应商限制为 1 个产品,我是想限制他们,以便他们每个订单只能从 1 个供应商处订购产品。例如,一旦他们将来自供应商“供应商 1”的产品添加到他们的购物车中,他们将无法添加来自“供应商 1”以外的任何其他供应商的产品。
我之前 post 尝试使用类别而不是自定义分类法,但我需要它们是分开的,所以我们不受类别的限制。这个 post 可以在这里找到:
以下仅允许将来自一个“供应商”的商品添加到购物车:
add_filter( 'woocommerce_add_to_cart_validation', 'only_one_supplier_by_order', 10, 2 );
function only_one_supplier_by_order( $passed, $product_id ) {
if ( WC()->cart->is_empty() )
return $passed;
$taxonomy = 'supplier';
$term_ids = wp_get_post_terms( $product_id, $taxonomy, ['fields' => 'ids']);
// Loop through cart items
foreach ( WC()->cart->get_cart() as $cart_item ) {
if( ! has_term( $term_ids, $taxonomy, $cart_item['product_id'] ) ) {
// Displaying a custom notice
wc_add_notice( __('This product is with a different supplier. Please only order from 1 supplier at a time.'), 'error' );
return false; // Avoid add to cart
}
}
return $passed;
}
现在要确保客户无法与购物车中的不同供应商结账,您可以添加:
// To be sure (avoiding checkout)
add_action( 'woocommerce_check_cart_items', 'only_one_supplier_by_order_check' );
function only_one_supplier_by_order_check() {
$taxonomy = 'supplier';
$term_names = []; // Initializing
// Loop through cart items
foreach ( WC()->cart->get_cart() as $cart_item ) {
$terms = wp_get_post_terms( $cart_item['product_id'], $taxonomy );
if( ! empty($terms) ) {
$term = reset($terms);
$term_names[$term->term_id] = $term->name;
}
}
// Allow only one supplier in cart (avoid checkout for more than one
if( count( $term_names ) > 1 ) {
// Displaying a custom notice
wc_add_notice( __('Only items from one supplier at the time are allowed in cart'), 'error' );
}
}
代码进入您的活动子主题(或活动主题)的 functions.php 文件。已测试并有效。
我试图限制我的 Woocommerce 商店的客户一次只能从 1 个“供应商”订购产品。我通过称为“供应商”的自定义分类法定义“供应商”。我正在尝试的代码只是出于某种原因限制了所有内容。
function filter_woocommerce_add_to_cart_validation( $passed, $product_id, $quantity, $variation_id = null, $variations = null ) {
// If passed
if ( $passed ) {
// If cart is NOT empty when a product is added
if ( !WC()->cart->is_empty() ) {
// Set vars
$current_product_tag_ids = array();
$in_cart_product_tag_ids = array();
// Get current product categories via product_id
$current_product_tag_ids = wc_get_product_term_ids( $product_id, 'supplier' );
// Loop through cart items checking for product categories
foreach ( WC()->cart->get_cart() as $cart_item ) {
// Get product categories from product in cart via cart item product id
$in_cart_product_tag_ids = array_merge( $in_cart_product_tag_ids, wc_get_product_term_ids( $cart_item['product_id'], 'product_cat' ) );
}
// Removes duplicate values
$in_cart_product_tag_ids = array_unique( $in_cart_product_tag_ids, SORT_NUMERIC );
// Compare
$compare = array_diff( $current_product_tag_ids, $in_cart_product_tag_ids );
// Result is NOT empty
if ( !empty ( $compare ) ) {
wc_add_notice( 'This product is with a different supplier. Please only order from 1 supplier at a time.', 'error' );
$passed = false;
}
}
}
return $passed;
}
add_filter( 'woocommerce_add_to_cart_validation', 'filter_woocommerce_add_to_cart_validation', 10, 5 );
我并不是想将每个供应商限制为 1 个产品,我是想限制他们,以便他们每个订单只能从 1 个供应商处订购产品。例如,一旦他们将来自供应商“供应商 1”的产品添加到他们的购物车中,他们将无法添加来自“供应商 1”以外的任何其他供应商的产品。
我之前 post 尝试使用类别而不是自定义分类法,但我需要它们是分开的,所以我们不受类别的限制。这个 post 可以在这里找到:
以下仅允许将来自一个“供应商”的商品添加到购物车:
add_filter( 'woocommerce_add_to_cart_validation', 'only_one_supplier_by_order', 10, 2 );
function only_one_supplier_by_order( $passed, $product_id ) {
if ( WC()->cart->is_empty() )
return $passed;
$taxonomy = 'supplier';
$term_ids = wp_get_post_terms( $product_id, $taxonomy, ['fields' => 'ids']);
// Loop through cart items
foreach ( WC()->cart->get_cart() as $cart_item ) {
if( ! has_term( $term_ids, $taxonomy, $cart_item['product_id'] ) ) {
// Displaying a custom notice
wc_add_notice( __('This product is with a different supplier. Please only order from 1 supplier at a time.'), 'error' );
return false; // Avoid add to cart
}
}
return $passed;
}
现在要确保客户无法与购物车中的不同供应商结账,您可以添加:
// To be sure (avoiding checkout)
add_action( 'woocommerce_check_cart_items', 'only_one_supplier_by_order_check' );
function only_one_supplier_by_order_check() {
$taxonomy = 'supplier';
$term_names = []; // Initializing
// Loop through cart items
foreach ( WC()->cart->get_cart() as $cart_item ) {
$terms = wp_get_post_terms( $cart_item['product_id'], $taxonomy );
if( ! empty($terms) ) {
$term = reset($terms);
$term_names[$term->term_id] = $term->name;
}
}
// Allow only one supplier in cart (avoid checkout for more than one
if( count( $term_names ) > 1 ) {
// Displaying a custom notice
wc_add_notice( __('Only items from one supplier at the time are allowed in cart'), 'error' );
}
}
代码进入您的活动子主题(或活动主题)的 functions.php 文件。已测试并有效。