Поскольку я действительно не знаю, как работает функция get_exchanged_currency()
, я не уверен в использовании суммы конверсии, но лог c находится в приведенном ниже коде.
Для обработки бесплатной доставки для минимальной суммы с использованием конвертации валюты
- Сначала вам нужно установить минимальную сумму ноль в настройках метода бесплатной доставки.
- код будет обрабатывать бесплатную доставку для примененных купонов с включенной опцией
- Вы укажете в коде минимальную сумму в валюте по умолчанию.
Также для обработки нескольких валют в качестве условия В операторах IF / ELSE вместо этого используется in_array()
.
Код:
add_filter('woocommerce_package_rates', 'filter_package_rates', 10, 2 );
function filter_package_rates( $rates, $package ) {
$currency = get_woocommerce_currency();
$free = array();
foreach ( $rates as $rate_key => $rate ) {
// For "flat_rate" (or "local_pickup") and NOT for 'USD', 'GBP', 'CHF' currencies
if ( ! in_array( $currency, array('USD', 'GBP', 'CHF') ) && 'free_shipping' !== $rate->method_id ) {
$rates[$rate_key]->cost = round( get_exchanged_currency( $currency, $rate->cost, true, 'EUR', '', true ), 2 );
}
// For "free_shipping
elseif ( 'free_shipping' === $rate->method_id ) {
$cart_total = WC()->cart->subtotal; // (or WC()->cart->get_subtotal() without taxes)
$min_amount = 100; // Free shipping min amount in EUR currency
$min_amount = round( get_exchanged_currency( $currency, $min_amount, true, 'EUR', '', true ), 2 ); // Min amount convversion
$free_shipping = new \WC_Shipping_Free_Shipping( $rate->instance_id );
$applied_coupons = WC()->cart->get_applied_coupons();
if ( 'either' === $free_shipping->requires && ! empty($applied_coupons) && $cart_total < $min_amount ) {
foreach ( $applied_coupons as $coupon_code ) {
$coupon = new WC_Coupon( $coupon_code );
if( $coupon->get_free_shipping() ) {
$coupon_free_ship = true;
break;
}
}
}
// Enable free shipping for a minimal cart amount or a coupon with free shipping option
if( $cart_total < $min_amount && ! isset($coupon_free_ship) ) {
unset($rates[$rate_key]);
} else {
$free[$rate_key] = $rate;
break;
}
}
}
return ! empty( $free ) ? $free : $rates;
}
Код входит в functions. php файл вашей активной дочерней темы (или активной темы). Должно работать.
Примененный купон с включенной опцией бесплатной доставки:
Когда промежуточная сумма заказа меньше минимально необходимой суммы и применяется купон с бесплатной доставкой, активируется метод бесплатной доставки, скрывая другие способы доставки.
Refresh the shipping caches:
- This code is already saved on your functions.php file.
- In a shipping zone settings, disable / save any shipping method, then enable back / save.
You are done and you can test it.
Related: WooCommerce - Скрыть другие способы доставки, когда доступна БЕСПЛАТНАЯ ДОСТАВКА