Отредактировал мой вопрос для лучшего понимания
WooCommerce имеет следующие два способа доставки:
- Бесплатная доставка
- Предварительная доставка ($ 3)
Кроме того, у меня есть два правила, чтобы решить, буду ли я предоставлять бесплатную доставку или предварительную доставку.
- Простой. Если общая сумма заказа превышает 50 долларов США.
Сложный. Допустим, это проверено на основе следующей функции
function complex_rule () {
// упрощенный пример
if (get_current_user_id () <50) {
вернуть истину;
еще {
вернуть ложь;
}
} </p>
Моя первая попытка, которая не сработала, выглядит следующим образом:
function enable_free_shipping( $cart_object ) {
if( WC()->cart->get_subtotal() > 50 || complex_rule() ) {
WC()->session->set('chosen_shipping_methods', array( 'free_shipping' ) );
}
}
add_action( 'woocommerce_before_calculate_totals', 'enable_free_shipping', 99 );
К сожалению, это не работает. У меня нет конкретной ошибки. Он просто игнорирует оба правила.
Исходя из следующего ответа , я тоже пытался это сделать, но чтобы упростить проблему и убедиться, что с функцией complex_rule()
вообще нет проблем, я сохранил только правило минимальной суммы.
Это код:
add_filter( 'woocommerce_package_rates', 'conditional_free_shipping', 100, 2 );
function conditional_free_shipping( $rates, $package ) {
// Set the min Order amount for free shipping
$min_order_amount = 50;
$cart_subtotal = (float) WC()->cart->get_subtotal(); // Subtotal excl. taxes
$free = array();
$free_key = '';
// Loop through shipping rates
foreach ( $rates as $rate_id => $rate ) {
if ( 'free_shipping' === $rate->method_id ) {
// Your conditions goes bellow
if ( $cart_subtotal >= $min_order_amount ) {
$free[ $rate_id ] = $rate;
}
$free_key = $rate_id;
break;
}
}
// No free shipping (Other shipping methods only)
if( empty( $free ) ) {
unset($rates[$free_key]);
return $rates;
}
// Only free shipping
else
return $free;
}
С учетом вышеизложенного я получаю желаемый результат (только бесплатная доставка) выше минимальной суммы, но проблема в случаях ниже этой суммы.
Все они были протестированы в новой установке Woocommerce с пустой дочерней темой (никакого другого кода в functions.php)