在WooCommerce 3.0+中将购买限制为1个产品类别

时间:2017-05-02 19:51:50

标签: php wordpress woocommerce categories product

我已将WooCommerce更新到版本3.0+,此自定义功能不再像以前那样工作了。即使我的购物车是空的,我也会收到错误消息,好像我的购物车中已有来自其他类别的商品。

以下是我正在使用的代码:

function is_product_the_same_cat($valid, $product_id, $quantity) {
    global $woocommerce;
    // start of the loop that fetches the cart items
    foreach ( $woocommerce->cart->get_cart() as $cart_item_key => $values ) {
        $_product = $values['data'];
        $terms = get_the_terms( $_product->id, 'product_cat' );
        $target_terms = get_the_terms( $product_id, 'product_cat' ); //get the current items
        foreach ($terms as $term) {
            $cat_ids[] = $term->term_id;  //get all the item categories in the cart
        }
        foreach ($target_terms as $term) {
            $target_cat_ids[] = $term->term_id; //get all the categories of the product
        }           
    }
    $same_cat = array_intersect($cat_ids, $target_cat_ids); //check if they have the same category
    if(count($same_cat) > 0) return $valid;
    else {
        wc_add_notice( 'This product is in another category!', 'error' );
        return false;
    }
}
add_filter( 'woocommerce_add_to_cart_validation', 'is_product_the_same_cat',10,3);

如何让它适用于WooCommerce 3.0+,任何想法?

由于

1 个答案:

答案 0 :(得分:0)

你应该试试这个不同的代码来做同样的事情:

add_filter( 'woocommerce_add_to_cart_validation', 'checking_conditionaly_product_categories', 10, 3 );
function checking_conditionaly_product_categories( $passed, $product_id, $quantity) {

    // Getting the product categories slugs in an array for the current product
    $product_cats_object = get_the_terms( $product_id, 'product_cat' );
    foreach($product_cats_object as $obj_prod_cat)
        $product_cats[] = $obj_prod_cat->slug;

    // Iterating through each cart item
    foreach (WC()->cart->get_cart() as $cart_item_values ){

        // When the product category of the current product match with a cart item
        if( has_term( $product_cats, 'product_cat', $cart_item_values['product_id'] ))
        {
            // Displaying a message
            wc_add_notice( 'Only one product from each category is allowed in cart', 'error' );
            $passed = false; // Set to false
            break; // stop the loop
        }
    }
    return $passed;
}

此代码位于活动子主题(或主题)的function.php文件中或任何插件文件中。

此代码经过测试,适用于WooCommerce版本2.6+和3.0 +

类似的答案:Allow only one product per product category in cart