Скидка на основе количества товаров для категории в корзине WooCommerce - PullRequest
1 голос
/ 18 июня 2020

У меня есть категория продуктов, стоимость которых составляет 15 долларов. Когда пользователь покупает от 10 до 20 товаров из этой категории, он должен получить скидку в размере 10 долларов. Когда пользователь покупает 20+, цена снова меняется до 5 долларов. Пользователю не может быть назначена специальная роль (например, оптовый продавец). Я создал код на основе кода LoicTheAzte c из другого вопроса и добавил свои собственные модификации и код. Похоже, должно работать. Я не получаю ошибок, но он не работает.

add_action('woocommerce_before_cart', 'check_product_category_in_cart');

function check_product_category_in_cart() {
    // HERE set your product categories in the array (can be IDs, slugs or names)
    $categories = array('surfacing-adhesives');
    $found      = false; // Initializing

    $count = 0;

    // Loop through cart items      
    foreach ( WC()->cart->get_cart() as $cart_item ) {
        // If product categories is found
        if ( has_term( $categories, 'product_cat', $cart_item['product_id'] ) ) {
            $count++;
        }
    }

    if (!current_user_can('wholesaler')) {
        // Discounts
        if ($count > 10 && $count < 20) {
            // Drop the per item price
            $price = 10;
        } else if ($count > 20) {
            // Drop the per item price
            $price = 5;
        } else {
            // Did not qualify for volume discount
        }
    }
}

1 Ответ

1 голос
/ 18 июня 2020

Вы используете неправильный хук, и есть некоторые недостающие вещи. Попробуйте следующее:

add_action( 'woocommerce_before_calculate_totals', 'discounted_cart_item_price', 20, 1 );
function discounted_cart_item_price( $cart ){
    // Not for wholesaler user role
    if ( ( is_admin() && ! defined( 'DOING_AJAX' ) ) || current_user_can('wholesaler') )
        return;

    // Required since Woocommerce version 3.2 for cart items properties changes
    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    // HERE set your product categories in the array (can be IDs, slugs or names)
    $categories = array('surfacing-adhesives');
    $categories = array('t-shirts');

    // Initializing
    $found = false;
    $count = 0;

    // 1st Loop: get category items count  
    foreach ( WC()->cart->get_cart() as $cart_item ) {
        // If product categories is found
        if ( has_term( $categories, 'product_cat', $cart_item['product_id'] ) ) {
            $count += $cart_item['quantity'];
        }
    }

    // Applying discount
    if ( $count >= 10 ) {
        // Discount calculation (Drop the per item qty price)
        $price = $count >= 20 ? 5 : 10;

        // 2nd Loop: Set discounted price  
        foreach ( WC()->cart->get_cart() as $cart_item ) {
            // If product categories is found
            if ( has_term( $categories, 'product_cat', $cart_item['product_id'] ) ) {
                $cart_item['data']->set_price( $price );
            }
        }
    }
}

Код входит в functions. php файл вашей активной дочерней темы (или активной темы). Проверено и работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...