问题描述
我在WooCommerce中遇到了一个问题,我想知道是否还有其他人也遇到过这个问题。
我出售的某些产品太脆弱,无法由UPS / dhl / FedEx运送。因此,我必须通过货盘运输这些产品。为了解决我的问题,我创建了“请求报价”运输方式,该方式允许我的客户选择BACS作为付款方式,请求报价作为运输方式并提交他们的订单。在计算完运输费用之后,我将更新订单(将运输方法更改为“不适用”),并将状态从“保留”更改为“待付款”,以便客户在需要时可以使用卡付款
这是我遇到的问题。我注意到,如果我取消设置几个付款网关,并且选择了这些特定的送货方式,即使我删除了“付款方式”端点(网站/我的帐户/订单/),客户也无法使用这些付款网关。订单的送货方式。
有没有解决的办法?
这是我用于禁用特定运输方式的付款网关的代码。
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;
}
更新,在咨询了一些开发人员之后,他们建议该代码在每次需要付款网关时都运行,并建议我仅在Checkout页面上运行此代码段。
if ( is_checkout_pay_page() ) {
// unset Payment Gateways
}
已解决,这是我的尝试,并且有效。但是不确定是否可以表达得更好:
add_filter( 'woocommerce_available_payment_gateways',1 );
function filter_woocommerce_available_payment_gateways( $available_gateways ) {
if ( ! ( is_checkout_pay_page() ) ) {
$gateways_to_disable = array( 'cardgatecreditcard',$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;
}
}