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

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

// Filter payment gatways for different shipping methods
function my_custom_available_payment_gateways( $gateways ) {
    $chosen_shipping_rates = WC()->session->get( 'chosen_shipping_methods' );
    if ( in_array( 'flat_rate:7', $chosen_shipping_rates ) ) {
        unset( $gateways['stripe'] );
        unset( $gateways['ppec_paypal'] );
    }
    endif;
    return $gateways;
}
 add_filter( 'woocommerce_available_payment_gateways', 
'my_custom_available_payment_gateways' );

все работает. за исключением того, что я получил эту ошибку на странице продукта.

Warning:
in_array() expects parameter 2 to be array, null given in [theme function.php and line number]

🤔 А знаете ли вы, что...
PHP поддерживает работу с куки для управления данными между запросами.


1
468
1

Ответ:

Решено

Используйте следующее, чтобы предотвратить эту ошибку (тоже удалено endif;):

// Filter payment gatways for different shipping methods
add_filter( 'woocommerce_available_payment_gateways', 'my_custom_available_payment_gateways', 10, 1 );
function my_custom_available_payment_gateways( $available_gateways ) {
if ( is_admin() ) return $available_gateways; // Only for frontend

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

    if ( in_array( 'flat_rate:12', $chosen_shipping_rates ) ) {
        unset( $available_gateways['stripe'], $available_gateways['ppec_paypal'] );
    }

    return $available_gateways;
}

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