检查购物车中是否包含多个强制性产品类别之一 [英] Checking that one of multiple mandatory products categories are in cart
问题描述
我必须检查购物车中是否有两个必填产品类别之一。
I have to check if one of my two mandatory products categories is in cart.
我已根据以下答案自定义了代码:
仅当商品属于强制性类别时才允许结账在购物车中
I have customized the code from this answer:
Allow checkout only when a product of a mandatory category is in cart
但是使用我的自定义代码,它始终仅检查其中一个,但出现一些错误。我的代码不起作用。
But with my custom code, it always checks for only one of them and I get some errors. My code is not working.
如何使它适用于2个产品类别而不是一个?
How can I make it work for 2 product categories instead of one?
这是代码:
// Function that define the mandatory product category
function your_mandatory_category_slug(){
// DEFINE HERE the SLUG of the needed product category
$category = 'cxsuite-download-option';
return $category;
}
function your_mandatory_category_slug_h(){
// DEFINE HERE the SLUG of the needed product category
$category_h = 'cxsuite-hosted-option';
return $category_h;
}
// Conditional function that returns true if the mandatory product category is in cart
function has_mandatory_category(){
$category_needed = your_mandatory_category_slug();
$category_needed_h = your_mandatory_category_slug_h();
$has_cat = false;
// Iterrating each item in cart and detecting…
foreach ( WC()->cart->get_cart() as $item ) {
// Detects if the needed product category is in cart items
if ( has_term($category_needed, 'product_cat', $item['product_id'] ) ) {
$has_cat = true;
break;
}
elseif ( has_term($category_needed_h, 'product_cat', $item['product_id'] ) ) {
$has_cat = true;
break;
}
}
return $has_cat;
}
// Function that display a message if there is not in cart a mandatory product category
function mandatory_category_display_message() {
$category_needed = your_mandatory_category_slug();
$category_needed_h = your_mandatory_category_slug_h();
// check that cart is not empty (for cart and product category archives)
if( !WC()->cart->is_empty() && ( is_cart() || is_product_category( $category_needed ) || is_product_category( $category_needed_h ) ) ){
$category_needed_single=null;
if( $category_needed=='cxsuite-download-option' ){
$category_needed_single='cxsuite-download-option';
}{
$category_needed_single=$category_needed_h;
}
$category_obj = get_term_by( 'slug', $category_needed_single, 'product_cat' );
if ( is_wp_error( $category_obj ) ) return;
// Display message when product category is not in cart items
if ( !has_mandatory_category() ) {
$category_name = $category_obj->name;
$category_url = get_term_link( $category_needed_single, 'product_cat' );
// render a notice to explain why checkout is blocked
wc_add_notice( sprintf( __( '<strong>Reminder:</strong> You have chosen Addon that can only be purchased together with a %1$s. Please add a %1$s (full or trial) before checking out. Please return <a href="%2$s"> here to "%1$s" product page</a>', 'your_theme_domain'), $category_name, $category_url ), 'error' );
}
}
}
add_action( 'woocommerce_before_main_content', 'mandatory_category_display_message', 30 ); // for product mandatory category archives pages
add_action( 'woocommerce_check_cart_items', 'mandatory_category_display_message' ); // for cat page
// Function that redirect from checkout to mandatory product category archives pages
function mandatory_category_checkout_redirect() {
// If cart is not empty on checkout page
if( !WC()->cart->is_empty() && is_checkout() ){
$category_needed = your_mandatory_category_slug();
$category_needed_h = your_mandatory_category_slug_h();
$category_needed_single=null;
if(is_product_category( $category_needed )){
$category_needed_single=$category_needed;
}else{
$category_needed_single=$category_needed_h;
}
// If missing product category => redirect to the products category page
if ( !has_mandatory_category() )
wp_redirect( get_term_link( $category_needed_single, 'product_cat' ) );
}
}
add_action('template_redirect', 'mandatory_category_checkout_redirect');
推荐答案
已更新 (2018年4月)
使用一系列产品,您只能部分使用从我的答案中选择的代码,用于2个或更多类别这样的类别:
You can only use partially the code you have picked up from my answer, for 2 or more categories, using an array of product categories this way:
// Function that define the mandatory product category
function your_mandatory_category_slug(){
// DEFINE HERE the 2 SLUGs of the needed product categories
$categories = array('cxsuite-download-option','cxsuite-hosted-option');
return $categories;
}
// Conditional function that returns true if the mandatory products categories are in cart
function has_mandatory_category(){
$categories_needed = your_mandatory_category_slug();
$has_cat = false;
// Iterrating each item in cart and detecting…
foreach ( WC()->cart->get_cart() as $item ) {
// iterating both categories
foreach ( $categories_needed as $category_needed ) {
// Detects if one of the needed product categories is in cart items
if ( has_term($category_needed, 'product_cat', $item['product_id'] ) )
$has_cat = true;
}
if($has_cat)
break;
}
return $has_cat;
}
// Function that display a message if there is not in cart a mandatory product category
function mandatory_category_display_message() {
$categories_needed = your_mandatory_category_slug();
// check that cart is not empty (for cart and product category archives)
if( !WC()->cart->is_empty() && ( is_cart() || is_product_category( $categories_needed[0] ) || is_product_category( $categories_needed[1] ) ) ){
$category_name = array();
$category_url = array();
// iterating both categories
foreach($categories_needed as $key => $category_needed){
$category_obj = get_term_by( 'slug', $category_needed, 'product_cat' );
if ( is_wp_error( $category_obj ) )
return;
$category_name[$key] = $category_obj->name;
$category_url[$key] = get_term_link( $category_needed, 'product_cat' );
}
// Display message when one of the product categories is not in cart items
if ( !has_mandatory_category() ) {
// render a notice to explain why checkout is blocked
wc_add_notice( sprintf( __( '<strong>Reminder:</strong> You have to add in your cart, a product from "%1$s" or from "%3$s" category, to be allowed to check out. Please return <a href="%2$s"> here to "%1$s"</a> or <a href="%4$s"> here to "%3$s"</a> product pages', 'your_theme_domain'), $category_name[0], $category_url[0], $category_name[1], $category_url[1] ), 'error' );
}
}
}
add_action( 'woocommerce_before_main_content', 'mandatory_category_display_message', 30 ); // for product mandatory category archives pages
add_action( 'woocommerce_check_cart_items', 'mandatory_category_display_message' ); // for cart page
但是您必须选择最后一个功能,介于2个之间重定向的产品类别…
But you will have to choose for the last function, between one of the 2 product categories for the redirection…
// Function that redirect from checkout to mandatory product category archives pages
function mandatory_category_checkout_redirect() {
// If cart is not empty on checkout page
if( !WC()->cart->is_empty() && is_checkout() ){
$categories_needed = your_mandatory_category_slug();
// If missing product category => redirect to the products category page
if ( !has_mandatory_category() )
wp_redirect( get_term_link( $categories_needed[0], 'product_cat' ) ); // or $categories_needed[1]
}
}
add_action('template_redirect', 'mandatory_category_checkout_redirect');
这会出现在您的活动子主题(或主题)的function.php文件中,或者在任何插件中文件。
This goes in function.php file of your active child theme (or theme) or also in any plugin file.
此代码基于以下功能答案:
仅当强制性类别中的商品在购物车中时才允许结帐
This code is based on this functional answer:
Allow checkout only when a product of a mandatory category is in cart
未经测试,但是应该可以工作……
It is untested, but it should work…
这篇关于检查购物车中是否包含多个强制性产品类别之一的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!