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

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

Мне интересно, могу ли я добавить следующее;

Вот оригинальный код, который я использую:

add_filter( 'woocommerce_package_rates', 'show_only_free_shipping_for_autodelivery', 100, 2 );
function show_only_free_shipping_for_autodelivery ( $rates, $package ) {
    // Loop through cart items
    foreach( $package['contents'] as $cart_item ){
        if( $cart_item['data']->get_meta('auto_delivery_default') == '90 Days' ) {
            $found = true;
            break; // Stop the loop
        }
    }

    if( ! ( isset($found) && $found ) )
        return $rates; // Exit

    $free = array();
    foreach ( $rates as $rate_id => $rate ) {
        if ( 'free_shipping' === $rate->method_id ) {
            $free[ $rate_id ] = $rate;
            break;
        }
    }
    return ! empty( $free ) ? $free : $rates;
}

Я пытаюсь заставить Free Shipping перезаписать минимальную сумму для бесплатной доставки, но все еще скрываю все варианты доставки на основе мета-значения для мета-ключа. 'auto_delivery_default',


Редактировать:

Наконец, я обнаружил, что это пользовательские данные корзины:
Целевой ключ delivery_options за ценность 3 months,

1 ответ

Решение

Обновление 2:

Следующий код принудительно заставит метод "Бесплатная доставка", когда в корзину с пользовательскими данными delivery_options имеет значение 3 months:

// Conditionally hide others shipping methods when free shipping is available
add_filter( 'woocommerce_package_rates', 'show_only_free_shipping_for_autodelivery', 100, 2 );
function show_only_free_shipping_for_autodelivery ( $rates, $package ) {
    // Loop through cart items
    foreach( $package['contents'] as $cart_item ){
        if( isset($cart_item['delivery_options']) && $cart_item['delivery_options'] == '3 months' ) {
            $found = true;
            break; // Stop the loop
        }
    }

    if( ! ( isset($found) && $found ) )
        return $rates; // Exit

    $free = array();
    foreach ( $rates as $rate_id => $rate ) {
        if ( 'free_shipping' === $rate->method_id ) {
            $free[ $rate_id ] = $rate;
            break;
        }
    }
    return ! empty( $free ) ? $free : $rates;
}


// Force free shipping for a specific custom field value
add_filter( 'woocommerce_shipping_free_shipping_is_available', 'filter_free_shipping_is_available', 20, 3 );
function filter_free_shipping_is_available ( $is_available, $package, $free_shipping ) {
    // Loop through cart items
    foreach( $package['contents'] as $cart_item ){
        if( isset($cart_item['delivery_options']) && $cart_item['delivery_options'] == '3 months' ) {
            $is_available = true;
            break; // Stop the loop
        }
    }

    return $is_available;
}

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

Необходимо временно обновить кэши доставки, включив " Режим отладки " в глобальных настройках доставки Woocommerce на вкладке "Параметры доставки ".
После тестирования и работы просто отключите его, и все будет работать.

Другие вопросы по тегам