programing

Woocommerce - 두 가지 카테고리의 아이템을 장바구니에 추가하지 않도록 합니다.

telecom 2023. 3. 11. 08:37
반응형

Woocommerce - 두 가지 카테고리의 아이템을 장바구니에 추가하지 않도록 합니다.

사용자가 다른 카테고리의 제품을 한꺼번에 카트에 추가하지 않도록 하고 싶습니다.예를 들어 사용자가 다른 카테고리로 이동하여 제품을 카트에 추가하려고 하면 먼저 카트가 비워집니다.제가 어떻게 접근할지 아는 사람 있나요?저는 이런 건 처음이에요.감사해요.

전에도 이 문제를 해결한 적이 있어요. 기록이 여기 있습니다.

두 번째 카테고리를 추가하려고 할 때 카트를 클리어하는 대신 원래 아이템을 카트에 보관하고 경고를 표시한다는 점에서 요청과 약간 다릅니다.

후세를 위해:

<?php

// Enforce single parent category items in cart at a time based on first item in cart
function get_product_top_level_category ( $product_id ) {

    $product_terms            =  get_the_terms ( $product_id, 'product_cat' );
    $product_category_term    =  $product_terms[0];
    $product_category_parent  =  $product_terms[0]->parent;

    while ( $product_category_parent  !=  0 ) {
            $product_category_term    =  get_term($product_category_parent, 'product_cat' );
            $product_category_parent  =  $product_category_term->parent;
    }

    return $product_category_term;

}

add_filter ( 'woocommerce_before_cart', 'restrict_cart_to_single_category' );
function restrict_cart_to_single_category() {
        global $woocommerce;
        $cart_contents    =  $woocommerce->cart->get_cart( );
        $cart_item_keys   =  array_keys ( $cart_contents );
        $cart_item_count  =  count ( $cart_item_keys );

        // Do nothing if the cart is empty
        // Do nothing if the cart only has one item
        if ( ! $cart_contents || $cart_item_count == 1 ) {
                return null;
        }

        // Multiple Items in cart
        $first_item                    =  $cart_item_keys[0];
        $first_item_id                 =  $cart_contents[$first_item]['product_id'];
        $first_item_top_category       =  get_product_top_level_category ( $first_item_id );
        $first_item_top_category_term  =  get_term ( $first_item_top_category, 'product_cat' );
        $first_item_top_category_name  =  $first_item_top_category_term->name;

        // Now we check each subsequent items top-level parent category
        foreach ( $cart_item_keys as $key ) {
                if ( $key  ==  $first_item ) {
                        continue;
                }
                else {
                        $product_id            =  $cart_contents[$key]['product_id'];
                        $product_top_category  =  get_product_top_level_category( $product_id );

                        if ( $product_top_category  !=  $first_item_top_category ) {
                                $woocommerce->cart->set_quantity ( $key, 0, true );
                                $mismatched_categories  =  1;
                        }
                }
        }

        // we really only want to display this message once for anyone, including those that have carts already prefilled
        if ( isset ( $mismatched_categories ) ) {
                echo '<p class="woocommerce-error">Only one category allowed in cart at a time.<br />You are currently allowed only <strong>'.$first_item_top_category_name.'</strong> items in your cart.<br />To order a different category empty your cart first.</p>';
        }
}
?>

이 문제를 해결하는 방법은 다음과 같습니다('city'를 'product_cat'로 대체하여 제품 카테고리에 적용할 수 있습니다).

function validate_add_cart_item( $passed, $product_id, $quantity, $variation_id = '', $variations= '' ) {

    // Get the list of cities for the item to be added
    $product_cities = get_the_terms( $product_id, 'city' );
    $cities_array = array_map(function($city){
        return $city->slug;
    }, $product_cities);

    // Get the cart items
    $item_in_cart = WC()->cart->get_cart();

    // Check for each item if the city is different
    foreach ($item_in_cart as $item){
        $cities = get_the_terms( $item['product_id'], 'city' );
        foreach ($cities as $city){
            if(!in_array($city->slug, $cities_array)){
                $passed = false;
                wc_add_notice( __( 'You cannot mix products from two cities', 'domain' ), 'error' );
            }
        }
    }

    return $passed;
}
add_filter( 'woocommerce_add_to_cart_validation', 'validate_add_cart_item', 10, 5 );

언급URL : https://stackoverflow.com/questions/26373256/woocommerce-prevent-adding-items-from-two-different-categories-to-cart

반응형