@V0VA

Как изменить алгoритм применения купона при расчете бесплатной доставки woocommerce?

Добрый день! На сайте применяются 3 порога для бесплатной доставки:
  • г. Москва (Бесплатная доставка при сумме заказа от 3000),
  • СПб от 5000,
  • Россия от 8000

Для этого используется плагин "WooCommerce Advanced Free Shipping".
6229ceba120ce744082265.png
Все вроде хорошо, но не получается изменить алгоритм расчета Бесплатной доставки.
Например, покупатель сделал заказ из СПб на 5500 руб.
Система считает ему бесплатную доставку.
Он применяет купон на скидку, допустим 20%
Сумма к оплате становится ниже порога в 5000, но доставка остается Бесплатной.
Вроде бы и в настройках плагина есть возможность задать параметром применение купона, но на практике величина купонов разная и в настройках нет возможности прописать условие, чтобы порогом считалось величина "Total", а не "Subtotal" .
6229cee8bd4c8967570112.png
Можете подсказать хук для wordpress, либо плагин с подобными настройками, чтобы бесплатная доставка вставала в 3х случаях:
1-й заказ с Мск >= 3000
2-й с Спб >= 5000
3-й остальные свыше 8000 руб
Если же применяется купон, то этот расчет должен производиться с "Итого" а не с "Подытог"
  • Вопрос задан
  • 54 просмотра
Решения вопроса 1
@V0VA Автор вопроса
Не нашел в свое время решения задачи при использовании этого плагина. Реализовал без него. Выкладываю решение, если кому вдруг понадобится. Порядок действий, создаем на штатной странице настроек доставки woocommerce бесплатные доставки в количестве, равном количеству городов у которых разный порог. В штатных настройках есть возможность настроить правила применения купонов . Добавляем в functions.php активной темы:
<?
function hard_remove_shipping_method( $rates, $package ) {
		$billingSity = WC()->customer->get_billing_city();
		//задаем через массивы. в будущем проще добавить город к условию	
		$arr = ['Москва','Санкт-Петербург'];
		$arrOne = ['Москва'];
		$arrTwo = ['Санкт-Петербург'];
		
		$reRates = $rates;
		
		//если не Москва и не Санкт-Петербург,  сработает общее условие для беспл доставки
		if (!in_array($billingSity, $arr)){
		//отключаем методы, не подходящие для региона
			unset( $reRates[ 'local_pickup:10' ] );	//  'local_pickup:10'  и прочие...  у вас вместо этих значений будут ваши можно посмотреть в инструментах разработчика в браузере
			unset( $reRates[ 'flat_rate:28' ] );
			unset( $reRates[ 'flat_rate:27' ] );	
			unset( $reRates[ 'free_shipping:11' ] );
			unset( $reRates[ 'free_shipping:26' ] );
			$new_rates = array();
			
			// в цикле проверяем,  есть ли бесплатная доставка
			foreach ( $reRates as $rate_id => $rate ) {
				if ( 'free_shipping' === $rate->method_id ) { 
					$new_rates[ $rate_id ] = $rate;
					break; // бесплатную доставку нашли, выходим из цикла
				}
			}
			//Есть бесплатная, оставляем только ее
			if (!empty( $new_rates )) {
				$reRates = $new_rates; 
			}
			return 	$reRates;
		}
		
		// если Москва
		if (in_array($billingSity, $arrOne) ) {
			unset( $reRates[ 'flat_rate:28' ] );
			unset( $reRates[ 'flat_rate:41' ] );
			unset( $reRates[ 'flat_rate:42' ] );	
			unset( $reRates[ 'flat_rate:43' ] );
			unset( $reRates[ 'flat_rate:44' ] );
			unset( $reRates[ 'free_shipping:30' ] );
			unset( $reRates[ 'free_shipping:26' ] );
	    	
			$new_rates = array();
			foreach ( $reRates as $rate_id => $rate ) {
				if ( 'free_shipping' === $rate->method_id ) {
					$new_rates[ $rate_id ] = $rate;
					break;
				}
			}			
			if (!empty( $new_rates )) {
				unset( $reRates[ 'flat_rate:27' ] );			
			}
			return 	$reRates;
		}
		
		// если Санкт-Петербург
		if (in_array($billingSity, $arrTwo)) {
			unset( $reRates[ 'flat_rate:27' ] );
			unset( $reRates[ 'flat_rate:41' ] );
			unset( $reRates[ 'flat_rate:42' ] );	
			unset( $reRates[ 'flat_rate:43' ] );
			unset( $reRates[ 'flat_rate:44' ] );
			unset( $reRates[ 'free_shipping:30' ] );
			unset( $reRates[ 'free_shipping:11' ] );
			
			$new_rates = array();
			foreach ( $reRates as $rate_id => $rate ) {
				if ( 'free_shipping' === $rate->method_id ) {
					$new_rates[ $rate_id ] = $rate;
					break;
				}
			}			
			if (!empty( $new_rates )) {
				unset( $reRates[ 'flat_rate:28' ] );			
			}
			return 	$reRates;
		}	
		
		return $reRates;
	}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы