Отключить платежный шлюз для определенного способа доставки только при оформлении заказа

Я столкнулся с проблемой в WooCommerce, и мне интересно, сталкивался ли с ней еще кто-нибудь.

Я продаю определенные товары, которые слишком хрупкие для отправки через UPS / DHL / FedEx. Поэтому я должен отправить эти продукты на поддоне. Чтобы решить свою проблему, я создал запрос метода доставки сметы, который позволяет моим клиентам выбирать BACS в качестве метода оплаты, запрашивать расчет стоимости в качестве метода доставки и отправлять свои заказы. И после того, как я рассчитал стоимость доставки, я обновляю заказ (меняю способ доставки на N / A) и меняю статус с отложенного на ожидающий платеж, чтобы позволить покупателю оплатить картой, если он хочет.

Здесь я столкнулся с проблемой. Я заметил, что если я отключу несколько платежных шлюзов и если выбраны эти определенные способы доставки, эти платежные шлюзы будут недоступны для клиента в конечной точке заказа-оплаты (веб-сайт / my-account / orders /), даже если я удалю способ доставки. от заказа.

Это можно обойти?

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

add_filter( 'woocommerce_available_payment_gateways', 'filter_woocommerce_available_payment_gateways', 10, 1 );

function filter_woocommerce_available_payment_gateways( $available_gateways ) { 

    $gateways_to_disable = array( 'cardgatecreditcard', 'cardgategiropay', 'cardgateideal', 'cardgatesofortbanking' );
    $shipping_methods = array( 'flat_rate', 'request_shipping_quote' );
    $disable_gateways = false;

    // Check if we need to disable gateways
    foreach ( $shipping_methods as $shipping_method ) {
        if ( strpos( WC()->session->get( 'chosen_shipping_methods' )[0], $shipping_method ) !== false ) $disable_gateways = true;
    }
    
    // If so, disable the gateways
    if ( $disable_gateways ) {
        foreach ( $available_gateways as $id => $gateway ) {
            if ( in_array( $id, $gateways_to_disable ) ) {
                unset( $available_gateways[$id] );
            }
        }
    }
    return $available_gateways;
}

ОБНОВЛЕНИЕ. После консультации с несколькими разработчиками они посоветовали запускать этот код каждый раз, когда требуются платежные шлюзы, и предложили запускать этот фрагмент только на странице оформления заказа.

Они предложили добавить в мой код следующее:

if ( is_checkout_pay_page() ) {
    // unset Payment Gateways
}

РЕШЕНО. Вот моя попытка, и она работает. Но не уверен, можно ли это выразить лучше:

add_filter( 'woocommerce_available_payment_gateways', 'filter_woocommerce_available_payment_gateways', 10, 1 );

function filter_woocommerce_available_payment_gateways( $available_gateways ) { 

    if ( ! ( is_checkout_pay_page() ) ) {

    $gateways_to_disable = array( 'cardgatecreditcard', 'cardgategiropay', 'cardgateideal', 'cardgatesofortbanking' );
    $shipping_methods = array( 'flat_rate', 'request_shipping_quote' );
    $disable_gateways = false;

    // Check if we need to disable gateways
    foreach ( $shipping_methods as $shipping_method ) {
        if ( strpos( WC()->session->get( 'chosen_shipping_methods' )[0], $shipping_method ) !== false ) $disable_gateways = true;
    }
    
    // If so, disable the gateways
    if ( $disable_gateways ) {
        foreach ( $available_gateways as $id => $gateway ) {
            if ( in_array( $id, $gateways_to_disable ) ) {
                unset( $available_gateways[$id] );
            }
        }
    }
    return $available_gateways;
}
else { return $available_gateways;
    }
}

person Wanderlust Consulting    schedule 16.10.2020    source источник