Да, можно отключить платежные шлюзы для групп из нескольких категорий продуктов.
1) В отдельной функции ниже мы определяем наши группы категорий продуктов и платежных шлюзов. Категории продуктов могут быть либо термином(ами), идентификатором(ами), слагом(ями), либо именем(ями). Итак, в этой функции мы определяем наши настройки, которые будут использоваться:
// 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;
}
Код находится в файле functions.php вашей активной дочерней темы (или активной темы). Проверено и работает.
person
LoicTheAztec
schedule
06.06.2020