Woocommerce, скрыть способ доставки на основе класса доставки

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

Я начинаю с этого кода и изменяю его, как показано ниже:

add_filter( 'woocommerce_available_shipping_methods', 'hide_shipping_based_on_class' ,    10, 1 );

function check_cart_for_share() {

// load the contents of the cart into an array.
global $woocommerce;
$cart = $woocommerce->cart->cart_contents;

$found = false;

// loop through the array looking for the tag you set. Switch to true if the tag is     found.
foreach ($cart as $array_item) {
$term_list = wp_get_post_terms( $array_item['product_id'], 'product_shipping_class', array( "fields" => "names" ) );

if (in_array("Frozen",$term_list)) {

      $found = true;
      break;
    }
}

return $found;

}

function hide_shipping_based_on_class( $available_methods ) {

// use the function above to check the cart for the tag.
if ( check_cart_for_share() ) {

// remove the rate you want
unset( $available_methods['canada_post,purolator,fedex:FEDEX_GROUND,fedex:GOUND_HOME_DELIVERY'] ); 
}

// return the available methods without the one you unset.
return $available_methods;

}

Однако, похоже, он не скрывает никаких способов доставки. Не уверен, что мне не хватает ...

Это многосайтовая установка, я тестирую ее на канадской стороне на http://stjeans.harbourcitydevelopment.com

Я использую модуль доставки Table Rate, а также модули FedEx, Purolator и Canada Post.


person SeanEnns    schedule 16.05.2014    source источник


Ответы (2)


У меня была такая же проблема, и помогла модификация вашего кода. Одна из проблем заключается в том, что фильтр «woocommerce_available_shipping_methods» устарел из WooCommerce 2.1. Поэтому вам нужно использовать новый: «woocommerce_package_rates». Существует руководство по WooCommerce. для аналогичной задачи тоже.

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

Я думаю, ваша проблема была (помимо устаревшего крючка) в основном в неправильной строке unset ($ available_methods [...]). Это не могло так работать.

Итак, вот мой код:

add_filter( 'woocommerce_package_rates', 'hide_shipping_based_on_class' ,    10, 2 );
function hide_shipping_based_on_class( $available_methods ) {
    if ( check_cart_for_share() ) {
        foreach($available_methods as $key=>$method) {
            if( strpos($key,'YOUR_METHOD_KEY') !== FALSE ) {
                $new_rates = array();
                $new_rates[$key] = $method;
                return $new_rates;
            }
        }
    }
    return $available_methods;
}

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

person Marek    schedule 10.10.2014
comment
Вы можете заставить woocommerce_package_rates запускаться каждый раз, включив режим отладки доставки. Перейдите в WooCommerce ›Доставка› Варианты доставки ›Включить режим отладки. - person Ryan Hertz; 24.03.2018
comment
+1 за предупреждение о том, что крюк не срабатывает каждый раз, если вы не обновите товары в корзине. Я понятия не имел, почему крючок вообще не работает. - person jwinn; 05.04.2018
comment
Спасибо вам обоим за эти комментарии. Эта штука, которая не стреляла, сводила меня с ума. - person Eolis; 09.04.2018
comment
Ну, ну, ну, если @Ryan не спасатель ... 3 года спустя какой-то бедняга тоже сошел с ума y u not fire???? - person brasofilo; 29.05.2021

Приведенный ниже фрагмент кода позволяет скрыть способы доставки в зависимости от класса доставки. Подробное описание доступно на здесь

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

function wf_hide_shipping_method_based_on_shipping_class($available_shipping_methods, $package)
{
$hide_when_shipping_class_exist = array(
    42 => array(
        'free_shipping'
    )
);

$hide_when_shipping_class_not_exist = array(
    42 => array(
        'wf_shipping_ups:03',
        'wf_shipping_ups:02',
         'wf_shipping_ups:01'
    ),
    43 => array(
        'free_shipping'
    )
);


$shipping_class_in_cart = array();
foreach(WC()->cart->cart_contents as $key => $values) {
   $shipping_class_in_cart[] = $values['data']->get_shipping_class_id();
}

foreach($hide_when_shipping_class_exist as $class_id => $methods) {
    if(in_array($class_id, $shipping_class_in_cart)){
        foreach($methods as & $current_method) {
            unset($available_shipping_methods[$current_method]);
        }
    }
}
foreach($hide_when_shipping_class_not_exist as $class_id => $methods) {
    if(!in_array($class_id, $shipping_class_in_cart)){
        foreach($methods as & $current_method) {
            unset($available_shipping_methods[$current_method]);
        }
    }
}
return $available_shipping_methods;
}
person Nishad Up    schedule 04.10.2016