Добавьте плату в зависимости от выбранного способа доставки в WooCommerce

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

Я нашел "Добавить плату в зависимости от способа доставки и способа оплаты в Woocommerce". Ответ, похоже, мне нужен.

Я попробовал код и удалил ненужные мне сведения о способе оплаты.

Проблема в том, что когда я меняю способ доставки, комиссия не добавляется, похоже, что я просто сохраняю старое значение в сеансе.

Это мой код:

// Add a conditional fee
add_action( 'woocommerce_cart_calculate_fees', 'add_cod_fee', 20, 1 );
function add_cod_fee( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    $chosen_shipping_method_id = WC()->session->get( 'chosen_shipping_methods' )[0];

    var_dump($chosen_shipping_method_id); die;

    switch($chosen_shipping_method_id){
        case 'flat_rate:3': {
            $fee_text = __( "Spese per ritiro", "woocommerce" );
            $cart->add_fee( $fee_text, 12, false );
            break;
        }
        case 'flat_rate:4': {
            $fee_text = __( "Spese per consegna a domicilio", "woocommerce" );
            $cart->add_fee( $fee_text, 24, false );
            break;
        }

    }
}

// Refresh checkout on payment method change
add_action( 'wp_footer', 'refresh_checkout_script' );
function refresh_checkout_script() {
    // Only on checkout page
    if( is_checkout() && ! is_wc_endpoint_url('order-received') ) :
    ?>
    <script type="text/javascript">
    jQuery(function($){
        // On payment method change
        $('form.woocommerce-checkout').on( 'change', '.shipping_method', function(){
            // Refresh checkout
            $('body').trigger('update_checkout');
        });
    })
    </script>
    <?php
    endif;
}

Просто сохраните старое значение в $chosen_shipping_method_id


person Christian Giupponi    schedule 20.05.2019    source источник


Ответы (1)


Ваш код будет работать нормально, если вы прокомментируете var_dump($chosen_shipping_method_id); die;. Также сценарий jQuery не нужен, поскольку он был для способов оплаты, которые не обновляют оформление заказа по умолчанию.

Значит, в вашем случае есть еще кое-что, что создает проблемы.

Теперь я немного пересмотрел ваш код (он тоже будет работать):

// Add a conditional fee
add_action( 'woocommerce_cart_calculate_fees', 'flat_rate_based_fee', 20, 1 );
function flat_rate_based_fee( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    $chosen_shipping_methods = WC()->session->get( 'chosen_shipping_methods' );

    if( in_array( 'flat_rate:3', $chosen_shipping_methods ) ) {
        $fee = array( 'text' => __( "Spese per ritiro", "woocommerce" ), 'amount' => 12 );
    } elseif ( in_array( 'flat_rate:4', $chosen_shipping_methods ) ) {
        $fee = array( 'text' => __( "Spese per consegna a domicilio", "woocommerce" ), 'amount' => 24 );
    }

    if( isset($fee) ) {
        $cart->add_fee( $fee['text'], $fee['amount'], false );
    }
}

Код находится в файле functions.php вашей активной дочерней темы (или активной темы).

Протестировано и работает (в Woocommerce 3.5.x и 3.6.x). Посмотрите, как это работает в реальном времени на этом тестовом сервере.

person LoicTheAztec    schedule 20.05.2019
comment
Хорошо, моя проблема заключалась в использовании этого кода с плагином подписки, он добавил плату за еженедельную подписку вместо заказа. Я поменял $cart->add_fee на WC()->cart->add_fee и теперь он работает - person Christian Giupponi; 21.05.2019
comment
@LoicTheAztec Хороший. Как добавить / удалить цену на самом методе вместо использования add_fee? - person mysticalghoul; 14.01.2020