Отключить определенный способ доставки, если в Woocommerce выбран способ оплаты наложенным платежом

Мне нужно отключить определенный способ доставки, если пользователь выбрал оплату "Наложенный платеж". Проблема в том, что следующий код работает, только если я каждый раз сбрасываю переходные процессы WooCommerce и обновляю их. Это не работает при выборе пользователя туда-сюда.

add_filter( 'woocommerce_package_rates', 'alter_shipping_methods', 100 );
function alter_shipping_methods( $rates ) {

    $chosen_gateway = WC()->session->chosen_payment_method;

    // If payment is Cash on delivery remove specific shipping 
    if($chosen_gateway == 'cod') {

        foreach ( $rates as $rate_id => $rate ) {
           if ( $rate->label === 'Hrvatska pošta' ) {
              unset( $rates[ $rate_id ] );
            }
       }

    }

    return $rates;

}

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

jQuery(document.body).on('change', 'input[name="payment_method"]', function() {
    console.log('Payment method changed');
    jQuery('body').trigger('update_checkout');
});

Я пытался с этим, это не работает

function action_woocommerce_checkout_update_order_review($array, $int) {
    WC()->cart->calculate_shipping();
    return;
}
add_action('woocommerce_checkout_update_order_review', 'action_woocommerce_checkout_update_order_review', 10, 2);

И я также попытался пользовательский вызов AJAX, который вызывает функцию PHP и внутри этого фильтра, безрезультатно

add_filter( 'woocommerce_package_rates', 'alter_shipping_methods', 100 );

Что я должен попробовать дальше?

1 ответ

Решение

Вот полный рабочий способ сделать так, чтобы способ оплаты "ХПК" отключил определенный способ доставки.

В первой функции вам нужно будет указать идентификатор способа доставки, который вы хотите скрыть.

Код:

// Conditionally show/hide shipping methods
add_filter( 'woocommerce_package_rates','show_hide_shipping_methods', 90, 2 );
function show_hide_shipping_methods( $rates, $package ) {
    if ( WC()->session->get('hide_shipping' ) == '1' ){
        // HERE below set your shipping methods IDs to be removed
        unset($rates['flat_rate:12']);
    }
    return $rates;
}

// Function that gets the Ajax data
add_action( 'wp_ajax_session_hideit', 'wc_session_hide_shipping_method' );
add_action( 'wp_ajax_nopriv_session_hideit', 'wc_session_hide_shipping_method' );
function wc_session_hide_shipping_method() {
    if ( isset($_POST['disable_smi']) && $_POST['disable_smi'] == '1' ){
        WC()->session->set('hide_shipping', '1' );
    } else {
        WC()->session->set('hide_shipping', '0' );
    }
    // Just for testing ==> To be removed
    echo json_encode( WC()->session->get('billing_ups' ) );
    die(); // Alway at the end (to avoid server error 500)
}

// Enabling, disabling and refreshing session shipping methods data
add_action( 'woocommerce_checkout_update_order_review', 'refresh_shipping_methods', 10, 1 );
function refresh_shipping_methods( $post_data ){
    $bool = true;
    if ( WC()->session->get('hide_shipping' ) == '1' ) $bool = false;

    // Mandatory to make it work with shipping methods
    foreach ( WC()->cart->get_shipping_packages() as $package_key => $package ){
        WC()->session->set( 'shipping_for_package_' . $package_key, $bool );
    }
    WC()->cart->calculate_shipping();
}

// The Jquery script
add_action( 'wp_footer', 'custom_checkout_script' );
function custom_checkout_script() {
    if( ! is_checkout() ) return;
    ?>
    <script type="text/javascript">
    jQuery( function($){
        // The Ajax function
        function triggerAjax(b){
            $.ajax({
                type: 'POST',
                url: wc_checkout_params.ajax_url,
                data: {
                    'action': 'session_hideit',
                    'disable_smi': b,
                },
                success: function (response) {
                    $('body').trigger('update_checkout');
                    // just for testing ==> to be removed
                    console.log('response: '+response);
                },
                error: function(error){
                    // just for testing ==> to be removed
                    console.log(error);
                }
            });
        }
        var a = 'input[name^="payment_method"]';

        // Once Dom is loaded
        if( $(a).val() === 'cod' )
            triggerAjax(1);

        // On payment method change
        $( 'form.checkout' ).on('change', a, function() {
            var b = 0;
            if( $(this).val() === 'cod' )
                b = 1;
            triggerAjax(b);
        });
    });
    </script>
    <?php
}

Код помещается в файл function.php вашей активной дочерней темы (или активной темы). Проверено и работает.

Чтобы получить правильный идентификатор способа доставки, вы можете воспользоваться инспектором браузера следующим образом:

Другие вопросы по тегам