Отключить способ доставки для определенного способа оплаты в Woocommerce - PullRequest
0 голосов
/ 10 декабря 2018

В Woocommerce я включил 2 способа доставки: бесплатная доставка или фиксированная ставка.Я включил 2 способа оплаты: банковский перевод (bacs) и PayPal (paypal) .

Чего я хочу добиться: если клиент выбирает PayPal в качестве типа платежа, он должен быть вынужден выбрать «Единый тариф» в качестве способа доставки.«Бесплатная доставка» должна быть либо скрытой, либо серой, либо что-то в этом роде.

Если выбран банковский перевод, то должны быть доступны оба способа доставки.

Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Если кому-то интересно, я нашел решение:

function alter_payment_gateways( $list ){
    // Retrieve chosen shipping options from all possible packages
    $chosen_rates = ( isset( WC()->session ) ) ? WC()->session->get( 'chosen_shipping_methods' ) : array();
    if( in_array( 'free_shipping:1', $chosen_rates ) ) {
        $array_diff = array('WC_Gateway_Paypal');
        $list = array_diff( $list, $array_diff );
    }
    return $list;
}
add_action('woocommerce_payment_gateways', 'alter_payment_gateways');

Этот код отключит PayPal, если клиент выберет бесплатную доставку.

0 голосов
/ 10 декабря 2018

Обновление 2: Следующий код отключит способ доставки "free_shipping" (идентификатор метода) , когда выбран вариант оплаты "paypal":

add_filter( 'woocommerce_package_rates', 'shipping_methods_based_on_chosen_payment', 100, 2 );
function shipping_methods_based_on_chosen_payment( $rates, $package ) {
    // Checking if "paypal" is the chosen payment method
    if ( WC()->session->get( 'chosen_payment_method' ) === 'paypal' ) {
        // Loop through shipping methods rates
        foreach( $rates as $rate_key => $rate ){
            if ( 'free_shipping' === $rate->method_id ) {
                unset($rates[$rate_key]); // Remove 'Free shipping'shipping method
            }
        }
    }
    return $rates;
}

// 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('chosen_payment_method' ) ) $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();
}

// Jquery script for checkout page
add_action('wp_footer', 'refresh_checkout_on_payment_method_change' );
function refresh_checkout_on_payment_method_change() {
    // Only checkout page
    if( is_checkout() && ! is_wc_endpoint_url() ):
    ?>
    <script type="text/javascript">
    jQuery(function($){
        // On shipping method change
        $('form.checkout').on( 'change', 'input[name^="payment_method"]', function(){
            $('body').trigger('update_checkout'); // Trigger Ajax checkout refresh
        });
    })
    </script>
    <?php
    endif;
}

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

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

enter image description here

...