仅在结账时禁用特定运输方式的支付网关
Disable Payment Gateway For Specific Shipping Method On Checkout Only
我 运行 遇到了 WooCommerce 中的一个问题,我想知道是否有其他人也遇到过。
我销售的某些产品太易碎,无法由 UPS/DHL/FedEx 运送。所以我必须通过托盘运送这些产品。为了解决我的问题,我创建了一个“请求报价”运输方式,允许我的客户将 select BACS 作为付款方式,请求报价作为运输方式并提交他们的订单。在我计算完运费后,我更新订单(将运输方式更改为 N/A)并将状态从“保留”更改为“待付款”以允许客户通过卡支付,如果他们希望。
这就是我 运行 进入问题的地方。我注意到,如果我取消设置多个支付网关,并且如果这些特定的运输方式被 selected,这些支付网关在“订单支付”端点 (website/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;
}
}
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( 'paymentgateway1', 'paymentgateway2', 'paymentgateway3' );
$shipping_methods = array( 'shippingmethod1', 'shippingmethod2', 'shippingmethod3' );
$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;
}
}
我 运行 遇到了 WooCommerce 中的一个问题,我想知道是否有其他人也遇到过。
我销售的某些产品太易碎,无法由 UPS/DHL/FedEx 运送。所以我必须通过托盘运送这些产品。为了解决我的问题,我创建了一个“请求报价”运输方式,允许我的客户将 select BACS 作为付款方式,请求报价作为运输方式并提交他们的订单。在我计算完运费后,我更新订单(将运输方式更改为 N/A)并将状态从“保留”更改为“待付款”以允许客户通过卡支付,如果他们希望。
这就是我 运行 进入问题的地方。我注意到,如果我取消设置多个支付网关,并且如果这些特定的运输方式被 selected,这些支付网关在“订单支付”端点 (website/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;
}
}
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( 'paymentgateway1', 'paymentgateway2', 'paymentgateway3' );
$shipping_methods = array( 'shippingmethod1', 'shippingmethod2', 'shippingmethod3' );
$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;
}
}