WooCommerce 2.6 – Скрытие оплачиваемой доставки, когда бесплатная доставка запускается путем достижения определенной суммы

Недавно я обновил WooCommerce 2.6 в своем магазине, и они обновили свою систему доставки. Прежде чем я использовал это, чтобы скрыть опцию оплачиваемого доставки, когда было достигнуто определенное значение заказа, и была произведена бесплатная доставка:

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

Хотя это больше не работает. Мне нужно новое исправление, и я действительно не кодирую.

У кого-нибудь есть решение?

Вышеупомянутое решение было с этого сайта:
Спрячьте другие методы перевозкы груза когда СВОБОДНАЯ ПЕРЕВОЗКА ГРУЗА имеющаяся

Я предполагаю, что некоторые параметры изменились с тех пор, как они обновили методы доставки.

Надеюсь, кто-то знает, как это исправить.

Попробуйте заменить существующий фрагмент ниже. Подробности этого фрагмента описаны в этой статье . Дайте мне знать, если это можно улучшить.

 add_filter('woocommerce_package_rates', 'xa_hide_shipping_rates_when_free_is_available', 10, 2); function xa_hide_shipping_rates_when_free_is_available($rates, $package) { global $woocommerce; $version = "2.6"; if (version_compare($woocommerce->version, $version, ">=")) { foreach($rates as $key => $value) { $key_part = explode(":", $key); $method_title = $key_part[0]; if ('free_shipping' == $method_title) { $free_shipping = $rates[$key]; // Unset all rates. $rates = array(); // Restore free shipping rate. $rates[$key] = $free_shipping; return $rates; } } } else { if (isset($rates['free_shipping'])) { // Below code is for unsetting single shipping method/option. // unset($rates['flat_rate']); $free_shipping = $rates['free_shipping']; // Unset all rates. $rates = array(); // Restore free shipping rate. $rates['free_shipping'] = $free_shipping; } } return $rates; } 

Хорошо, следующий код позволит локальный пикап с бесплатной доставкой:

 // ##### WOOCOMMERCE - HIDE OTHER SHIPPING METHODS WHEN FREE SHIPPING IS AVAILABLE ##### add_filter('woocommerce_package_rates', 'hide_shipping_when_free_is_available', 10, 2); function hide_shipping_when_free_is_available($rates, $package) { $free_yn = 0; $pickup_yn = 0; foreach($rates as $key => $value) { $key_part = explode(":", $key); $method_title = $key_part[0]; if ('free_shipping' == $method_title) { // check if free shipping rate exists $free_yn = 1; $free_shipping = $rates[$key]; $free_key = $key; } if ('local_pickup' == $method_title) { // check if local pickup rate exists $pickup_yn = 1; $local_pickup = $rates[$key]; $pickup_key = $key; } } if ($free_yn == 1) { // Unset all rates. $rates = array(); // Restore free shipping rate. $rates[$free_key] = $free_shipping; if ($pickup_yn == 1) { // Restore local pickup rate. $rates[$pickup_key] = $local_pickup; } return $rates; } return $rates; } 

Если вы удалили устаревшие методы доставки (методы доставки должны быть настроены с использованием новых зон доставки), вы можете использовать следующий фрагмент, чтобы удалить все другие способы доставки, когда доступна бесплатная доставка. (WooCommerce 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 ); 

Из обновленных документов