Условно бесплатная доставка в WooCommerce - PullRequest
0 голосов
/ 18 апреля 2019

Отредактировал мой вопрос для лучшего понимания

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)

1 Ответ

0 голосов
/ 18 апреля 2019

Насколько я понимаю, вы пытаетесь сделать бесплатную доставку выбранной в кассе, когда она превышает определенную сумму.

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

<?php 
  function site_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', 'site_my_hide_shipping_when_free_is_available', 100 );
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...