Методы доставки. Параметр Local Pickup недоступен при скрытой ставке.

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

Проблема: локальная опция pickup НЕ доступна для данной категории.

Как я могу сделать локальную опцию пикапа этой специальной категорией?

Это код, который я использую:

function custom_shipping_methods( $rates ){ // Define/replace here your correct category slug (!) $cat_slug = 'your_category_slug'; $prod_cat = false; // Going through each item in cart to see if there is anyone of your category foreach ( WC()->cart->get_cart() as $values ) { $item = $values['data']; if ( has_term( $cat_slug, 'product_cat', $item->id ) ) $prod_cat = true; } $rates_arr = array(); if ( $prod_cat ) { foreach($rates as $key => $rate) { if ('free_shipping' === $rate->method_id || 'local_pickup' === $rate->method_id || 'local_delivery' === $rate->method_id) { $rates_arr[ $rate_id ] = $rate; break; } } } return !empty( $rates_arr ) ? $rates_arr : $rates; } add_filter( 'woocommerce_package_rates', 'custom_shipping_methods', 100); 

Еще одна вещь: возможно ли показать местную доставку и местный пикап для этой специальной категории в зависимости от местоположения?

В настоящее время в моем магазине локальная доставка или доставка настроена только для одного места.

Solutions Collecting From Web of "Методы доставки. Параметр Local Pickup недоступен при скрытой ставке."

Совет: ТОЛЬКО для WooCommerce версии 2.6.x (добавлена ​​совместимость для WC 3+)

После многих тестов … Вам нужно будет изменить 2 мелочи в вашем коде:

 add_filter( 'woocommerce_package_rates', 'custom_shipping_methods', 100, 2 ); function custom_shipping_methods( $rates, $package ){ // Define/replace here your correct category slug (!) $cat_slug = 'posters'; $prod_cat = false; // Going through each item in cart to see if there is anyone of your category foreach ( WC()->cart->get_cart() as $values ) { $product = $values['data']; // compatibility with WC +3 $product_id = method_exists( $product, 'get_id' ) ? $product->get_id() : $product->id; if ( has_term( $cat_slug, 'product_cat', $product_id ) ) $prod_cat = true; } $rates_arr = array(); if ( $prod_cat ) { foreach($rates as $rate_id => $rate) { // <== There was a mistake here if ('free_shipping' === $rate->method_id || 'local_pickup' === $rate->method_id || 'local_delivery' === $rate->method_id) { $rates_arr[ $rate_id ] = $rate; // break; // <========= Removed this to avoid stoping the loop } } } return !empty( $rates_arr ) ? $rates_arr : $rates; } 

Перед добавлением фрагмента убедитесь, что вы очистили свой кеш WooCommerce (WooCommerce> Состояние системы> Инструменты> Переходные процессы WC> Очистить переходные процессы), поскольку методы кэширования кэшируются.

Было 2 ошибки:

  • Один в цикле foreach с неправильным именем переменной, который я заменил.
  • Удаленный break; избегая остановки цикла foreach, когда одно условие соответствует.

Этот код продолжается в файле functions.php вашей активной дочерней темы или темы.

Этот код проверен и полностью работоспособен (он будет работать, если вы правильно настроили свои зоны доставки) .


Рекомендации:

  • Спрячьте другие методы перевозкы груза когда СВОБОДНАЯ ПЕРЕВОЗКА ГРУЗА имеющаяся
  • WooCommerce – Скрыть другие способы доставки, когда доступна БЕСПЛАТНАЯ ДОСТАВКА