检查多个强制性产品类别中的一个是否在购物车中

时间:2016-11-04 20:54:50

标签: php wordpress woocommerce categories cart

我必须检查我的两个强制性产品类别中是否有一个在购物车中。

我已根据此答案自定义代码:
Allow checkout only when a product of a mandatory category is in cart

但是使用我的自定义代码,它总是仅检查其中一个,并且我得到一些错误。我的代码无效。

如何让它适用于2个产品类别而不是1个?

以下是代码:

SCNView

1 个答案:

答案 0 :(得分:1)

已更新 (2018年4月)

您只能部分使用您从我的答案中获取的代码,对于2个或更多类别,使用一系列产品类别:

// 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

但是您必须选择最后一个功能,在两个产品类别之一进行重定向...

// 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文件中,也可以在任何插件文件中。

此代码基于以下功能答案:
Allow checkout only when a product of a mandatory category is in cart

它未经测试,但它应该有用......