Включить бесплатную доставку для двух или более товаров в корзине в Woocommerce

В Woocommerce я хочу предложить бесплатную доставку в зависимости от количества товаров в корзине. Во-первых, я начал просматривать доступные плагины и не могу найти простого решения, основанного на количестве.

Все, что я хочу сделать, это: купить 2 чего-либо и получить бесплатную доставку.

Повозившись, я попробовал следующий код:

function free_ship( $is_available ) {
    $count = 0;
    global $woocommerce;
    $items = $woocommerce->cart->get_cart();
    foreach($items as $item) {
        $count++;
    }
    echo $count;

    if ( $count == 1 ) {
        echo 'add one more for free shipping';
        return $is_available;
    } elseif ($count > 1) {
        echo 'you get free shipping';
        return false;
    } else {
        echo 'nothing in your cart';
        return $is_available;
    }
}
add_filter( 'woocommerce_shipping_free_shipping_is_available', 'free_ship' );

Но зависает при добавлении товаров в корзину. Также глючит при удалении вещей из корзины. Я хотел бы понять это на PHP, чтобы я мог добавить больше уникальных условий, которые могут появиться в будущем.

Есть предложения?


person dev deque    schedule 17.03.2019    source источник


Ответы (1)


В вашем коде есть некоторые ошибки, такие как отсутствующие аргументы, сложности и устаревшие вещи… Вместо этого попробуйте следующее:

add_filter( 'woocommerce_shipping_free_shipping_is_available', 'free_shipping_for_x_cart_items', 10, 3 );
function free_shipping_for_x_cart_items( $is_available, $package, $shipping_method ) {
    $item_count = WC()->cart->get_cart_contents_count();

    if ( $item_count == 1 ) {
        $notice = __("Add one more for free shipping");
        $is_available = false;
    } elseif ($item_count > 1) {
        $notice = __("You get free shipping");
        $is_available = true;
    }

    if ( isset($notice) ) {
        wc_add_notice( $notice, 'notice' );
    }
    return $is_available;
}

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


Метод WC_Cart get_cart_contents_count() получает количество всех товаров (включая количество).

Чтобы получить количество различных товаров в корзине (без учета количества), замените строку:

$item_count = WC()->cart->get_cart_contents_count();

с этим:

$item_count = sizeof($package['contents']);
person LoicTheAztec    schedule 18.03.2019
comment
Большое спасибо за ваш подробный ответ! Ваше решение творит чудеса в его нынешнем виде и было отмечено как ответ. Я новичок в php, и на данном этапе пытаюсь обойтись. Спасибо, что помогли мне немного узнать об интеграции php и woocomerce. Я все еще не понимаю, почему целочисленные аргументы передаются в add_filter. - person dev deque; 18.03.2019