Требовать минимальный вес для способа доставки в WooCommerce

В магазине Woocommerce есть 3 варианта доставки

  • бесплатная доставка
  • Единая ставка
  • поднимать

Вдохновленный Бесплатная доставка в зависимости от веса и минимального количества корзины, я хотел бы указать минимальный общий вес корзины при выборе доставки вариант.

  • Когда клиенты заказывают до 24 кг, они должны иметь возможность только забрать свой заказ.
  • Если общий вес тележки составляет от 25 кг до 49 кг, они могут выбрать только метод фиксированной ставки или самовывоз.
  • А если общий вес тележки составляет 50 кг и выше, они могут выбирать между бесплатной доставкой и самовывозом.

В Интернете я нашел WooCommerce: как настроить многоуровневые тарифы на доставку по сумме заказа, которую я настроил для правильной работы в магазине, потому что у нас есть 2 зоны доставки (то есть несколько фиксированных ставок, местный самовывоз и т. д.).

К сожалению, это не подходит для моих нужд, а я считаю код верным? Любая помощь будет высоко ценится.

add_filter( 'woocommerce_package_rates', 'bbloomer_woocommerce_tiered_shipping', 9999, 2 );

function bbloomer_woocommerce_tiered_shipping( $rates, $package ) {
 
 if ( WC()->cart->get_cart_contents_weight() < 25 ) {
   
     if ( isset( $rates['local_pickup:5'], $rates['local_pickup:9'] ) ) unset( $rates['flat_rate:3'], $rates['flat_rate:6'], $rates['free_shipping:1'], $rates['free_shipping:8'] );
   
 } elseif ( WC()->cart->get_cart_contents_weight() < 50 ) {
   
     if ( isset( $rates['flat_rate:3'], $rates['flat_rate:6'], $rates['local_pickup:5'], $rates['local_pickup:9'] ) ) unset( $rates['free_shipping:1'], $rates['free_shipping:8'] );
   
 } else {
   
     if ( isset( $rates['free_shipping:1'], $rates['free_shipping:8'],  $rates['local_pickup:5'], $rates['local_pickup:9'] ) ) unset( $rates['flat_rate:3'], $rates['flat_rate:6'] );
   
 }

 return $rates;

}

person MediaCreandum    schedule 01.09.2020    source источник


Ответы (1)


Примечание: вы не можете добавить несколько условий к условию if способом, которым вы применяете Это.


Добавьте параметры доставки, которые вы хотите сохранить при определенных условиях, в массив $available_shipping

  • Когда клиенты заказывают до 24 кг = местный самовывоз
  • Если общий вес тележки составляет от 25 кг до 49 кг = местный самовывоз и фиксированная ставка
  • Если общий вес тележки составляет 50 кг и выше = самовывоз и бесплатная доставка.
function filter_woocommerce_package_rates( $rates, $package ) { 
    // Get cart contents weight
    $weight = WC()->cart->get_cart_contents_weight();
 
    // Conditions
    if ( $weight <= 24 ) {
        // Set available shipping options
        $available_shipping = array( 'local_pickup' );
    } elseif ( $weight > 24 || $weight < 50 ) {
        $available_shipping = array( 'local_pickup', 'flat_rate' );
    } else {
        $available_shipping = array( 'local_pickup', 'free_shipping' );
    }
    
    foreach ( $rates as $rate_key => $rate ) {
        // Targeting, NOT in array
        if ( ! in_array( $rate->method_id, $available_shipping ) ) {
            unset( $rates[$rate_key] );
        }
    }

    return $rates;
}
add_filter( 'woocommerce_package_rates', 'filter_woocommerce_package_rates', 10, 2 );
person 7uc1f3r    schedule 01.09.2020
comment
Спасибо за помощь! Но, к сожалению, когда я использую этот код, он всегда показывает только вариант подбора. Я что-то упускаю? - person MediaCreandum; 01.09.2020
comment
Этот код был протестирован в WC 4.4.1 и работает, вы всегда можете отладить / распечатать $weight, чтобы увидеть, соответствует ли он одному из других условий. - person 7uc1f3r; 01.09.2020
comment
Вы также можете попробовать обновить кеши доставки: в настройках зоны доставки отключите / сохраните любой способ доставки, затем включите возврат / сохранение. Когда это будет сделано, вы можете (повторно) протестировать его. - person 7uc1f3r; 01.09.2020
comment
Я обновил кеш классов доставки, но это не помогло. К сожалению, я не знаю, как отлаживать / распечатывать $weight, чтобы увидеть, соответствует ли он одному из других условий. Может быть, есть какие-нибудь мысли? - person MediaCreandum; 01.09.2020
comment
Нет, это все, что я могу сделать отсюда. Ответ работает по умолчанию, и если он не работает (полностью) для вас, вам придется отладьте его, чтобы увидеть, где что-то пошло не так. - person 7uc1f3r; 01.09.2020