删除定义的产品类别组的WooCommerce支付网关



我已经设法让此代码用于根据一个或多个产品类别删除一个支付网关。

我需要帮助的是删除多个支付网关。换句话说;它应该根据一个或多个产品类别删除一个或多个支付网关。

这就是我得到的,可能已经过时了?

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;
}

是的,可以为多个产品类别的组禁用支付网关。

1(在下面的单独功能中,我们定义了我们的产品类别和支付网关组。产品类别可以是术语 ID、蛞蝓或名称。因此,在此函数中,我们定义要使用的设置:

// 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(现在,挂钩功能将在结帐页面中删除基于购物车项目产品类别的支付网关,加载我们的设置功能:

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;
}

代码进入活动子主题(或活动主题(的函数.php文件。经过测试并工作。

最新更新