[英]Remove WooCommerce Payment Gateways for defined groups of product categories
I've manged to get this code to work for removing ONE payment gateway based on one or more product categories.我已经设法让此代码用于删除基于一个或多个产品类别的 ONE 支付网关。
What I need help with is removing multiple payment gateways as well.我需要帮助的是删除多个支付网关。 In other words;
换句话说; it should remove one or more payment gateways based on one or more product categories.
它应该根据一个或多个产品类别删除一个或多个支付网关。
This is what I got, which might be outdated?这是我得到的,可能已经过时了?
add_filter( 'woocommerce_available_payment_gateways', 'remove_gateway_based_on_category' );
function remove_gateway_based_on_category($available_gateways){
global $woocommerce;
if (is_admin() && !defined('DOING_AJAX')) return;
if (!(is_checkout() && !is_wc_endpoint_url())) return;
$unset = false;
$category_ids = array( '75' );
foreach ($woocommerce->cart->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['cod']);
return $available_gateways;
}
Yes it's possible to disable payment gateways for groups of multiple product categories.是的,可以为多个产品类别的组禁用支付网关。
1) In the separated function below we define our groups of product categories and payment gateways. 1) 在下面分开的 function 中,我们定义了我们的产品类别和支付网关组。 The product categories can be either term(s) id(s), slug(s) or name(s).
产品类别可以是term(s) id(s)、slug(s) 或name(s)。 So in this function we define our settings, to be used:
因此,在此 function 中,我们定义了要使用的设置:
// The settings in a function
function defined_categories_remove_payment_gateways() {
// Below, Define by groups the categories that will removed specific defined payment gateways
// The categories can be terms Ids, slugs or names
return array(
'group_1' => array(
'categories' => array( 11, 12, 16 ), // product category terms
'payment_ids' => array( 'cod' ), // <== payment(s) gateway(s) to be removed
),
'group_2' => array(
'categories' => array( 13, 17, 15 ), // product category terms
'payment_ids' => array( 'bacs', 'cheque' ), // <== payment(s) gateway(s) to be removed
),
'group_3' => array(
'categories' => array( 14, 19, 47 ), // product category terms
'payment_ids' => array( 'paypal' ), // <== payment(s) gateway(s) to be removed
),
);
}
2) Now the hooked function that will remove, in checkout page, the payment gateways based on the cart items product categories, loading our settings function: 2) 现在挂钩的 function 将在结帐页面中删除基于购物车项目产品类别的支付网关,加载我们的设置 function:
add_filter( 'woocommerce_available_payment_gateways', 'remove_gateway_based_on_category' );
function remove_gateway_based_on_category( $available_gateways ){
// Only on checkout page
if ( is_checkout() && ! is_wc_endpoint_url() ) {
$settings_data = defined_categories_remove_payment_gateways(); // Load settings
$unset_gateways = []; // Initializing
// 1. Loop through cart items
foreach ( WC()->cart->get_cart() as $cart_item ) {
// 2. Loop through category settings
foreach ( $settings_data as $group_values ) {
// // Checking the item product category
if ( has_term( $group_values['categories'], 'product_cat', $cart_item['product_id'] ) ) {
// Add the payment gateways Ids to be removed to the array
$unset_gateways = array_merge( $unset_gateways, $group_values['payment_ids'] );
break; // Stop the loop
}
}
}
// Check that array of payment Ids is not empty
if ( count($unset_gateways) > 0 ) {
// 3. Loop through payment gateways to be removed
foreach ( array_unique($unset_gateways) as $payment_id ) {
if( isset($available_gateways[$payment_id]) ) {
// Remove the payment gateway
unset($available_gateways[$payment_id]);
}
}
}
}
return $available_gateways;
}
Code goes in functions.php file of your active child theme (or active theme).代码进入您的活动子主题(或活动主题)的functions.php 文件。 Tested and works.
测试和工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.