提问者:小点点

限制基于子产品类别的购物车


我希望使用WooCommerce的“添加到购物车”验证来限制特定类别的操作。

我有两类父母:A类和B类。

对于A类,它应该是无限制的。因此,可以随时将其添加到购物车中。

对于B类,我有不同的子类别。我希望限制它,以便在任何时候都只能在购物车中存在一个类别为B类的子类别。我想出现一个错误消息,如果有人试图添加第二个B类儿童类别产品到购物车时,有一个冲突的儿童猫已经在购物车。

子类别将不断变化,因此按子类别ID进行查询不是一个选项——必须通过父类别进行查询。这也是一个选项,使所有的B类子类别成为父类别,但我仍然需要将A类从限制中排除。

基于cart answer code中每个产品类别只允许一个产品,这是我到目前为止所做的,尝试使其仅在所添加的产品不是来自Cat A的情况下运行cart循环:

add_filter( 'woocommerce_add_to_cart_validation', 'custom_checking_product_added_to_cart', 10, 3 );
function custom_checking_product_added_to_cart( $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;

    if ( ! $product_cats['cat-a-slug']) {
    
    // Iterating through each cart item
    foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item ){

        // When the product category of the current product does not match with a cart item
        if( ! has_term( $product_cats, 'product_cat', $cart_item['product_id'] ))
        {
            // Don't add 
            $passed = false;
            
            // Displaying a message
            wc_add_notice( 'Only one product from a category is allowed in cart', 'error' );

            // We stop the loop
            break;
        }
    }
    }
    return $passed;
}

这满足了我对Cat B产品的要求,但也限制了我不想要的Cat A。

虽然也有类似的问题,但我还没有找到一个能解决我问题的答案。我似乎无法让它忽略猫A,所以它是不受限制的,或者正确地阅读儿童类别。


共1个答案

匿名用户

如果您的代码符合类别B的逻辑,您可以添加此控件以始终允许添加到购物车中的属于类别A的产品:

// if the product belongs to category A allows the addition of the product to the cart
if ( has_term( 'cat-a-slug', 'product_cat', $product_id ) ) {
    return $passed;
}

所以完整的功能将是:

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

    // if the product belongs to category A allows the addition of the product to the cart
    if ( has_term( 'cat-a-slug', 'product_cat', $product_id ) ) {
        return $passed;
    }

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

    // if the product belongs to category B
    if ( in_array( 'cat-b-slug', $product_cats ) ) {
        // Iterating through each cart item
        foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {

            // When the product category of the current product does not match with a cart item
            if ( ! has_term( $product_cats, 'product_cat', $cart_item['product_id'] ) ) {
                // Don't add 
                $passed = false;
                
                // Displaying a message
                wc_add_notice( 'Only one product from a category is allowed in cart', 'error' );

                // We stop the loop
                break;
            }
        }
    }

    return $passed;
}

我还没有测试代码,但它应该可以工作。将其添加到活动主题的功能中。php。