最近,我遇到了一个问题,即在结账页面上运行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会话变量中,并在结账时使用该变量来决定是否运行筛选器挂钩。
标签:
PHP