• Никакой политики на форуме. Иначе - бан!
  • Вопрос без рабочей ссылки на проблему считается риторическим. Без ссылки и скриншота - провокацией!
  • Темы озаглавленные с маленькой буквы или капсом удаляются без предупреждения!

Решено Как скрыть платную доставку, когда доступна бесплатная?

Ed777

Опытный
У меня добавлено 3 способа доставки: платная, бесплатная курьерская для одного города и плагин Новой почты.
Подскажите как сделать что бы оставался бесплатный способ (когда он доступен) и Новая почта, т.к. бесплатный только для одного города.
В интернете нашел код, но он у меня не работает, пропадает платная доставка и Новой почтой, нужно что бы пропадала только платная.
Возможно нужно что то изменить в коде? Подскажите!

/**
* Hide shipping rates when free shipping is available, but keep "Local pickup"
* Updated to support WooCommerce 2.6 Shipping Zones
*/

function hide_shipping_when_free_is_available( $rates, $package ) {
$new_rates = array();
foreach ( $rates as $rate_id => $rate ) {
// Only modify rates if free_shipping is present.
if ( 'free_shipping' === $rate->method_id ) {
$new_rates[ $rate_id ] = $rate;
break;
}
}

if ( ! empty( $new_rates ) ) {
//Save local pickup if it's present.
foreach ( $rates as $rate_id => $rate ) {
if ('local_pickup' === $rate->method_id ) {
$new_rates[ $rate_id ] = $rate;
break;
}
}
return $new_rates;
}

return $rates;
}

add_filter( 'woocommerce_package_rates', 'hide_shipping_when_free_is_available', 10, 2 );
 

Ed777

Опытный
Вопрос решен. Может кому то нужно будет что то такое, в коде необходимо заменить local_pickup на nova_poshta_shipping_method (Ваш метод который необходимо оставить вместе с бесплатной доставкой). Выделил жирным в коде.

function hide_shipping_when_free_is_available( $rates, $package ) {
$new_rates = array();
foreach ( $rates as $rate_id => $rate ) {
// Only modify rates if free_shipping is present.
if ( 'free_shipping' === $rate->method_id ) {
$new_rates[ $rate_id ] = $rate;
break;
}
}

if ( ! empty( $new_rates ) ) {
//Save local pickup if it's present.
foreach ( $rates as $rate_id => $rate ) {
if ('local_pickup' === $rate->method_id ) {
$new_rates[ $rate_id ] = $rate;
break;
}
}
return $new_rates;
}

return $rates;
}

add_filter( 'woocommerce_package_rates', 'hide_shipping_when_free_is_available', 10, 2 );
 

dim70

Опытный
Здесь актуальный рабочий код и описание, как оставить бесплатный способ доставки, а ненужные скрыть:
Вот собственно код:
PHP:
add_filter( 'woocommerce_package_rates', 'truemisha_remove_shipping_method', 20, 2 );
 
function truemisha_remove_shipping_method( $rates, $package ) {
 
    // удаляем способ доставки, если доступна бесплатная
    if ( isset( $rates[ 'free_shipping:1' ] ) ) {
        unset( $rates[ 'flat_rate:2' ] );
    }
 
    return $rates;
 
}
 

fgter

Новичок
Вопрос решен. Может кому то нужно будет что то такое, в коде необходимо заменить local_pickup на nova_poshta_shipping_method (Ваш метод который необходимо оставить вместе с бесплатной доставкой). Выделил жирным в коде.

function hide_shipping_when_free_is_available( $rates, $package ) {
$new_rates = array();
foreach ( $rates as $rate_id => $rate ) {
// Only modify rates if free_shipping is present.
if ( 'free_shipping' === $rate->method_id ) {
$new_rates[ $rate_id ] = $rate;
break;
}
}

if ( ! empty( $new_rates ) ) {
//Save local pickup if it's present.
foreach ( $rates as $rate_id => $rate ) {
if ('local_pickup' === $rate->method_id ) {
$new_rates[ $rate_id ] = $rate;
break;
}
}
return $new_rates;
}

return $rates;
}

add_filter( 'woocommerce_package_rates', 'hide_shipping_when_free_is_available', 10, 2 );
Спасибо большое. Local_pickup не менял
 
Сверху Снизу