Скрываем способы доставки, если доступна бесплатная доставка

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

И в этом небольшом уроке мы с вами попробуем это реализовать при помощи сниппета для 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 ), но есть и более мягкое решение:

Как узнать ID способа доставки в WooCommerce
Нужно лишь в браузере проинспектировать соответствующий элемент.

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

И да, не забудьте потом почистить кэш в админке, для этого переходим в 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;
 
}

Миша

В последние годы я долго не знал, что мне делать с сайтом misha.blog, ведь он практически не приносит никакого профита, но недавно я осознал, что моя миссия – способствовать распространению WordPress. Ведь WordPress – это лучший движок для разработки сайтов – как для тех, кто готов использовать заложенную структуру этой CMS, так и для тех, кто предпочитает headless решения.

Сам же я впервые познакомился с WordPress в 2009 году. Организатор WordCamp. Преподаватель в школах Epic Skills и LoftSchool.

Если вам нужна помощь с вашим сайтом или может даже разработка с нуля на WordPress / WooCommerce — пишите. Я и моя команда сделаем вам всё на лучшем уровне.

Комментарии — 2

  • Ivan Shatsky 27 июля 2020 #

    Михаил, здравствуйте!
    Во-первых, поскольку это мой первый комментарий в вашем блоге, хочу сказать большое спасибо за большое количество крайне полезных материалов, некоторые из которых крепко мне пригодились за последние несколько лет, на протяжении которых мне пришлось углубиться в WordPress/WooCommerce.
    А теперь собственно говоря, вопрос. Вот эти суффиксы - ':1', ':2' - они как генерируются, вы не разбирались случайно? Мне однажды довелось убирать метод доставки "Новой почтой", который добавлялся отдельным плагином, с товаров определённых классов доставки, так там элемент массива $rates всегда назывался 'delivery_nova_pochta' безо всяких суффиксов. И когда я попробовал позже применить такой же код к другим методам доставки, с удивлением обнаружил, что там присутствуют ещё и какие-то номера в виде суффиксов. В итоге сделал вот так:

    function hide_shipping_methods( $available_shipping_methods, $package ) {
        $shipping_classes = array( 'some-shipping-class-1', 'some-shipping-class-2' );
        $excluded_methods = array( 'free_shipping' );
        $shipping_class_exists = false;
        foreach( $package['contents'] as $key => $value )
            if ( in_array( $value['data']->get_shipping_class(), $shipping_classes ) ) {
                $shipping_class_exists = true;
                break;
            }
        if ( $shipping_class_exists ) {
            $methods_to_exclude = array();
            foreach( $available_shipping_methods as $method => $method_obj )
                if ( in_array( $method_obj->method_id, $excluded_methods ) )
                    $methods_to_exclude[] = $method;
            if ( $methods_to_exclude )
                foreach ( $methods_to_exclude as $method )
                    unset( $available_shipping_methods[$method] );
        }
        return $available_shipping_methods;
    }
    add_filter( 'woocommerce_package_rates', 'hide_shipping_methods', 10, 2 );
    • Миша 29 июля 2020 #

      Здравствуйте!

      Спасибо вам, я очень рад, что мой блог вам помог!

      Смотрите, когда мы добавляем способы доставки WooCommerce типо "Бесплатная доставка" или "Единая ставка", мы можем добавить несколько одинаковых, например несколько бесплатных способов доставки, поэтому WooCommerce нумерует их, т.к. они не могут иметь одинаковые ярлыки.

Оставить комментарий

Если вы хотите добавить код, не забудьте обернуть его в <pre lang="php"></pre>, если же код – меньше одной строчки, то можно и в <code></code>.