Вполне возможно, что в каких-то ситуациях вы не захотите отображать некоторые из способов доставки в том случае, если для вашего покупателя доступна опция бесплатной доставки.
И в этом небольшом уроке мы с вами попробуем это реализовать при помощи сниппета для functions.php
.
Если вы хотите немного расширить свои знания по WooCommerce и уметь гораздо больше, чем вставлять готовые сниппеты кода, то рекомендую вам мой видеокурс 🚀
Делать это мы будем при помощи фильтр-хука woocommerce_shipping_rates
:
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; }
free_shipping:1
и flat_rate:2
– это идентификаторы способов доставки, на разных сайтах они всегда разные, понятно, что вы можете узнать их прямо внутри этого хука при помощи print_r( $rates )
, но есть и более мягкое решение:
Как вы возможно догадались, то эти условия можно устанавливать не обязательно для бесплатных способов доставки, а вообще для любых других.
И да, не забудьте потом почистить кэш в админке, для этого переходим в WooCommerce > Статус > Инструменты и нажимаем соответствующую кнопку напротив транзитов WooCommerce.
И напоследок хочу показать вам чуть более универсальный код, который позволит скрыть все способы доставки в случае, если доступна бесплатная, и тут вам даже не придётся заморачиваться с поиском ID способов доставки:
add_filter( 'woocommerce_package_rates', 'truemisha_remove_all_shippings', 10, 2 ); function truemisha_remove_all_shippings( $rates, $package ) { $new_rates = array(); // в цикле чекаем, если среди доставок есть бесплатная foreach ( $rates as $rate_id => $rate ) { if ( 'free_shipping' === $rate->method_id ) { $new_rates[ $rate_id ] = $rate; break; // бесплатную доставку нашли, выходим из цикла } } return ! empty( $new_rates ) ? $new_rates : $rates; }
Чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или войдите.
Михаил, здравствуйте!
Во-первых, поскольку это мой первый комментарий в вашем блоге, хочу сказать большое спасибо за большое количество крайне полезных материалов, некоторые из которых крепко мне пригодились за последние несколько лет, на протяжении которых мне пришлось углубиться в WordPress/WooCommerce.
А теперь собственно говоря, вопрос. Вот эти суффиксы -
':1'
,':2'
- они как генерируются, вы не разбирались случайно? Мне однажды довелось убирать метод доставки "Новой почтой", который добавлялся отдельным плагином, с товаров определённых классов доставки, так там элемент массива$rates
всегда назывался'delivery_nova_pochta'
безо всяких суффиксов. И когда я попробовал позже применить такой же код к другим методам доставки, с удивлением обнаружил, что там присутствуют ещё и какие-то номера в виде суффиксов. В итоге сделал вот так:Здравствуйте!
Спасибо вам, я очень рад, что мой блог вам помог!
Смотрите, когда мы добавляем способы доставки WooCommerce типо "Бесплатная доставка" или "Единая ставка", мы можем добавить несколько одинаковых, например несколько бесплатных способов доставки, поэтому WooCommerce нумерует их, т.к. они не могут иметь одинаковые ярлыки.
Здравствуйте. Спасибо за ваш сайт.
Научите как при этом можно оставить пункт "самовывоз". То ест пункт самовывоз не скрывать.
Здравствуйте, а описанный в уроке способ не работает?
Здравствуйте! Тыкните пожалуйста что нужно сделать? "Научите как при этом можно оставить пункт "самовывоз"
Михаил, опять Всё работает ))) Спасибо. 10/10
Супер!!
Добрый день, Михаил! Спасибо за кучу полезных материалов!
У меня возникла такая ситуация:
Минимальная сумма заказа для бесплатной доставки 1500 грн. В корзине товара на сумму 1600 грн, все способы доставки скрываются и остается только бесплатная доставка. Но если из корзины убрать один товар и сумма меняется на 1300 грн (то есть сумма меньше, чем надо для бесплатной доставки), то способ доставки так и остается бесплатный. Как сделать так, чтоб отображались все доступные способы доставки?
Добрый день Нина,
Пожалуйста! :)
А я только что у себя протестировал на Storefront и всё вроде работает.
У меня вот такой код получился. Я так понимаю, что вторую часть кода (там где Скрываем способы доставки) неправильно вставила. Буду очень благодарна за помощь!
Миша, все разобралась, код верный, просто не поменяла сумму бесплатной доставки в настройках Woocommerce. Еще раз спасибо!)
Спасибо за решение!
Здравствуйте, Миша. Спасибо за ваш сайт. Подскажите, как вывести сообщение перед корзиной о том, что "Параметры доставки не найдены для...", когда адрес не найден? Спасибо
Здравствуйте,
А каким образом ищется адрес?
Здравствуйте! Большое спасибо за информацию!
Возник вопрос: При определенных условиях случается, что доступны несколько способов доставки с разными ценами. Например flat_rate:2 = 300р и flat_rate:8 = 500р, как оставить самый дешевый вариант и скрыть остальные?
спасибо
Здравствуйте! Записать сначала первый попавшийся в цикле и в отдельную переменную – его цену. Затем в последующих итерациях цикла проверять цену, если она ниже, то перезаписываем.
Логику понял, а вот реализовать как в коде - не понял))
Подскажите, как скрыть методы доставки, которые выходят сразу по умолчанию, до расчета?
Например выходит самовывоз и доставка 100 руб., после нажатия "рассчитать доставку" выходит СДЭК, клиенты не всегда понимают, что эту кнопку можно нажать, по этому хочу отображать все методы после нажатия.