woocommerce_available_payment_gateways筛选器挂钩多次触发

最近,我遇到了一个问题,即在结账页面上运行woocommerce_available_payment_gateways筛选器挂钩时,它会运行两次。为了测试,我在结账页面上让它输出123123,但实际上它显示了1231235555(这是在else语句中的内容)<- 这意味着它运行了两次并且绕过了/满足了两个条件。那么,如何防止这种行为呢?

以下是解决此问题的方法:

phpCopy code// 将URL变量存储在WC Session变量中
add_action( 'template_redirect', 'save_checkoutid_as_wc_session_variable' );
function save_checkoutid_as_wc_session_variable() {
    if( is_checkout() && isset($_GET[ 'checkoutid']) && $_GET['checkoutid' ] == '50' ){
        WC()->session->set('checkout_id', esc_attr($_GET['checkoutid']));
    }
}

add_filter( 'woocommerce_available_payment_gateways', 'selected_custom_checkout_gateways' );
function selected_custom_checkout_gateways( $available_gateways ) {
    // 不在后台(管理员)中
    if( ! is_admin() && isset(WC()->session) ) {
        $checkout_id = WC()->session->get('checkout_id');

        if( $checkout_id  == '50' ){
            $code = 123123; // 用于测试
            unset( $available_gateways[ 'cod' ], $available_gateways[ 'cheque' ] ) ;
        }
        else{
            $code = 5555; // 用于测试
        }
        
        $debug = "code: {$code} | checkout_id: {$checkout_id}"; // 用于测试
        error_log($debug); // 用于测试
    }
    return $available_gateways;
}

// 在订单创建后删除WC Session变量
add_action( 'woocommerce_checkout_order_created', 'remove_checkout_id_wc_session_variable' );
function remove_checkout_id_wc_session_variable() {
    if ( WC()->session->__isset('checkout_id') ){ 
        WC()->session->__unset('checkout_id');
    }
}

将上述代码放入您的子主题的functions.php文件中(或插件中),这应该可以解决问题。这段代码将保存URL变量到WC会话变量中,并在结账时使用该变量来决定是否运行筛选器挂钩。