Настройка бесплатной доставки в WooCommerce магазине + хаки и модули

Click here to view original web page at wordpressinside.ru
Бесплатная доставка WooCommerce

Сегодня обновлю одну из заметок блога о плагине WooCommerce, посвященную организации бесплатной доставки в интернет-магазине. Рассмотрю основные особенности функции Free Shipping + парочку интересных приемов-сниппетов и модулей по теме.

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

Создание и настройка бесплатной доставки

В базовой комплектации WooCommerce имеется несколько вариантов доставки: единая ставка, самовывоз и бесплатная. В новой актуальной версии вам сначала надо создать «Зону доставки» (например, страна или город), а затем уже добавлять определенные ее типы.

Создание бесплатной доставки в WooCommerce

Находятся все эти фишки в разделе «WooCommerce» — «Настройки», где нужно будет выбрать вкладку «Доставка». После добавления зоны и перехода на ее страницу в самом низу кликайте по кнопке «Добавить метод» и выбирайте соответствующий пункт.

Добавляем метод доставки
В настройках будет 3 поля:
  • название — отображается на сайте;
  • требование для срабатывания;
  • минимальная сумма заказа, если важна.

В «Требованиях» следует определить в каком случае сработает функция бесплатной доставки. Есть такие опции как:

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

скидочным купоном / промокодом.

Внимание! Если у вас старая версия плагина магазина, то там интерфейс немного другой.

Бесплатная доставка старый WooCommerce
Функциональность включается через специальную одноименную кнопку-чекбокс, а все параметры задаются на одной странице без каких-либо всплывающий окон.

Хаки для бесплатной доставки в WooCommerce

По-умолчанию при выполнении заданного условия, соответствующий пункт просто выводится на странице корзины вместе с другими:

Бесплатная доставка в интернет-магазине

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

Внимание! Коды, приведенные ниже, добавляете в functions.php (при этом следите за тем, с какой версией работаете). Кстати, перед внедрением рекомендуется почистить кэш модуля — для этого в разделе «WooCommerce» — «Статус» — «Инструменты» напротив самого первого пункта WC transients кликаете кнопку Очистить.

Сниппет WooCommerce 3.0+

Как уже было сказано выше, он скрывает все методы кроме «free_shipping». У меня успешно работал и на WC 2.6.

/**
 * Hide shipping rates when free shipping is available.
 * Updated to support WooCommerce 2.6 Shipping Zones.
 *
 * @param array $rates Array of rates found for the package.
 * @return array
 */
function my_hide_shipping_when_free_is_available( $rates ) {
	$free = array();
	foreach ( $rates as $rate_id => $rate ) {
		if ( 'free_shipping' === $rate->method_id ) {
			$free[ $rate_id ] = $rate;
			break;
		}
	}
	return ! empty( $free ) ? $free : $rates;
}
add_filter( 'woocommerce_package_rates', 'my_hide_shipping_when_free_is_available', 100 );

Решение для версии 2.5

/**
 * woocommerce_package_rates is a 2.1+ hook
 */
add_filter( 'woocommerce_package_rates', 'hide_shipping_when_free_is_available', 10, 2 );
 
/**
 * Hide shipping rates when free shipping is available
 *
 * @param array $rates Array of rates found for the package
 * @param array $package The package array/object being shipped
 * @return array of modified rates
 */
function hide_shipping_when_free_is_available( $rates, $package ) {
 
 	// Only modify rates if free_shipping is present
  	if ( isset( $rates['free_shipping'] ) ) {
 
  		// To unset a single rate/method, do the following. This example unsets flat_rate shipping
  		unset( $rates['flat_rate'] );
 
  		// To unset all methods except for free_shipping, do the following
  		$free_shipping          = $rates['free_shipping'];
  		$rates                  = array();
  		$rates['free_shipping'] = $free_shipping;
	}
 
	return $rates;
}

Как показывать бесплатную+локальную доставки

В комментариях спрашивали по поводу скрытия НЕ всех вариантов. Вот хороший хак, где остается сразу 2 из них:

/**
 * 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 );

Если вы внимательно посмотрите, то в коде в операторе IF используются знакомые нам обозначения: free_shipping и local_pickup. Теоретически, вместо них можно попробовать и другие, например, единую ставку flat_rate:5 (цифра здесь меняется).

Кстати, если правка шаблона вам кажется сложной, лучше установите модуль WC Hide Shipping Methods, рассмотренный ниже. По сути, он дублирует этот сниппет.

Исключение определенных штатов

На официальной веб-страничке есть еще один интересный хак, выполняющие те же задачи, что и предыдущие, но не для всех штатов (США). Вероятно, для наших стран этот код не особо актуален, но возможно кому-то он пригодится для общего развития.

Плагины бесплатной доставки WooCommerce

Их всего 2 штуки на данный момент: первый будет поновее и попроще, а второй выполняет более комплексные задачи.

WC Hide Shipping Methods

Автоматически скрывает в процессе оформления заказа все варианты кроме «free shipping». Если надо, дополнительно имеется возможность оставлять и самовывоз (local pickup). Все параметры задаются в админке в настройках магазина:

Плагин WC Hide Shipping Methods
В принципе, решение полностью дублирует третий сниппет/хак выше, но оно является более дружелюбным и наглядным для новичков в WordPress.

Advanced Free Shipping

Плагин WooCommerce Advanced Free Shipping
Он позволяет указать некоторые дополнительные условия для бесплатной доставки в интернет-магазине, например:
  • общую сумму покупок;
  • страну или почтовый индекс;
  • вес, количество товара;
  • купон;
  • и многие другие.

На момент написания статьи актуальной была версия 1.1.3, минимальные требования — WordPress 4.0+, а оценка практически 5 из 5-ти. Скачать его можно тут либо найти по названию из админки.

После активации плагина функция появится в разделе «Доставка»:

Настройка модуля WooCommerce Advanced Free Shipping
Здесь:
  • во-первых, нужно его включить — ставите галочку «Enable Advanced Free Shipping»;
  • затем отмечаем и вторую опцию — она скроет все варианты доставки, если условие для бесплатной сработает (хак в таком случае не нужен);
  • в-третьих, кликаем по кнопке «Add Free Shipping Method» дабы создать соответствующие логические правила.
WooCommerce Advanced Free Shipping - настройка плагина

Вы можете добавить несколько групп параметров, которые будут работать по принципу «ИЛИ». То есть, функция срабатывает, если выполнится хотя бы один из заданных критериев — либо первый, либо второй. В каждой группе разрешается совмещать опции с принципом «И» (условие выполнится, если оба утверждения правдивы). На скриншоте примера выше логика действий следующая: доставка будет бесплатной для «города Киев + «минимальный заказ 500грн» ИЛИ для «города Київ + «мин. заказ 500грн».

Радует, что в качестве параметров вы можете выбрать действительно много всего: категорию продукции или наличие нужных товаров, вес/объем покупок, страну, город, почтовый код пользователя и т.п. Правила в них задаются через операторы «=», «!=», «>=», «<=». В целом, это отличный модуль, который значительно расширяет базовые возможности WP магазина.

Если есть что добавить по теме или будут какие-то вопросы, пишите в комментариях.