【发布时间】:2020-03-28 17:58:00
【问题描述】:
所以,我看到了如何根据产品类别取消设置支付网关的示例,例如这个(效果很好):
add_filter( 'woocommerce_available_payment_gateways',
'unset_gateway_by_category' );
function unset_gateway_by_category( $available_gateways ) {
if ( is_admin() ) return $available_gateways;
if ( ! is_checkout() ) return $available_gateways;
$unset = false;
$category_ids = array( 11810 );
foreach ( WC()->cart->get_cart_contents() as $key => $values ) {
$terms = get_the_terms( $values['product_id'], 'product_cat' );
foreach ( $terms as $term ) {
if ( in_array( $term->term_id, $category_ids ) ) {
$unset = true;
break;
}
}
}
if ( $unset == true ) unset( $available_gateways['worldpay'] );
if ( $unset == true ) unset( $available_gateways['ppec_paypal'] );
return $available_gateways;
}
在这种情况下,如果购物车中有任何产品类别 ID 为 11810 的产品,则删除付款方式 Worldpay 和 PayPal。
但是,它并不能完全满足我的需求。
所以,如果您有类别 1、2、3 和 4...以及付款方式 a、b 和 c。
产品类别4只能使用支付网关c,产品类别1,2和3只能使用支付网关a和b。
如果购物车中有所有类别的产品(包括类别 4),那么上面的代码将隐藏支付方式 a 和 b,只留下网关 c(完美运行)。但是...如果购物车不包含任何类别 4 的产品,如何取消设置网关 c?
我想我需要一个 elsif 在某个地方,但是...我不是 php ninja,所以希望能得到一些指导。
提前致谢。
更新:
下面的版本是迄今为止最接近的。
当购物车中没有受限产品时,它会隐藏专家网关。 当购物车中只有受限产品时,它会隐藏常规网关。
但是...如果有一个普通产品和受限产品的麦克风...它会隐藏所有网关。
add_filter( 'woocommerce_available_payment_gateways',
'unset_gateway_by_category' );
function unset_gateway_by_category( $available_gateways ) {
if ( is_admin() ) return $available_gateways;
if ( ! is_checkout() ) return $available_gateways;
$unset = false;
$category_ids = array( 15, 166, 11810 );
/*This will dynamically map the payment gateway that need to be hidden for
the specific category id*/
$category_payment_map = array(
'15' => array('totalprocessing'),
'166' => array('totalprocessing'),
'11810' => array('worldpay', 'ppec_paypal')
);
foreach ( WC()->cart->get_cart_contents() as $key => $values ) {
$terms = get_the_terms( $values['product_id'], 'product_cat' );
foreach ( $terms as $term ) {
if ( in_array( $term->term_id, $category_ids ) ) {
/*Based on Term Id, fetch the payment gateway that need to
be hide from the $category_payment_map array*/
$payment_gateway_ids = $category_payment_map[$term->term_id];
/*you can check here whether the $payment_gateway_id is an array or sin*/
foreach ($payment_gateway_ids as $key => $payment_gateway_id) {
unset( $available_gateways[$payment_gateway_id] );
}
}
}
}
return $available_gateways;
}
我认为它需要某种规则来说明,如果购物车混合了常规产品和受限产品,则受限产品规则适用并覆盖其他规则?
谢谢
【问题讨论】:
-
用
$payment_gateway_id替换拼写错误$$payment_gateway_id -
修复了这个问题。谢谢。但是,一切都很好,直到您的购物车中混合了常规产品和受限产品。在这种情况下,它会取消设置所有支付网关。
-
很高兴听到它运行良好。谢谢
-
@MominIqbal 不,你误会了,它工作不正常。如果您的购物车中有常规产品和受限产品,它会隐藏所有网关。
标签: php wordpress woocommerce