Отключить некоторые состояния, если в Woocommerce есть определенные товары в корзине

Используя woocommerce, мне удалось изменить штаты в Ирландии, включая следующий код в файле function.php

function  wc_ie_counties_add_counties( $states ) {
$states['IE'] = array(
'Carlow' => 'Carlow',
'Cavan' => 'Cavan',
'Clare' => 'Clare',
'Cork' => 'Cork',
'Donegal' => 'Donegal',
'Dublin' => 'Dublin',
'Galway' => 'Galway',
'Kerry' => 'Kerry',
'Kildare' => 'Kildare',
'Kilkenny' => 'Kilkenny',
'Laois' => 'Laois',
'Leitrim' => 'Leitrim',
'Limerick' => 'Limerick',
'Longford' => 'Longford',
'Louth' => 'Louth',
'Mayo' => 'Mayo',
'Meath' => 'Meath',
'Monaghan' => 'Monaghan',
'Offaly' => 'Offaly',
'Roscommon' => 'Roscommon',
'Sligo' => 'Sligo',
'Tipperary' => 'Tipperary',
'Waterford' => 'Waterford',
'Westmeath' => 'Westmeath',
'Wexford' => 'Wexford',
'Wicklow' => 'Wicklow',
);
return $states;
}
add_filter( 'woocommerce_states', 'wc_ie_counties_add_counties' );

Но я хотел бы удалить несколько округов, если в корзине указан конкретный идентификатор продукта.

Пример. Если идентификатор продукта 581 и / или 590 находится в корзине, отображаются только состояния Дублин, Каван и Карлоу.

Спасибо,

1

Решение

Используя ваш реальный код, вам нужно установить 2 массива состояний: один ограниченный и один завершенный. Нам также нужно будет зарегистрировать товары в корзине для идентификаторов продуктов 581 и / или 590. Если один из этих продуктов находится в корзине, мы устанавливаем ограниченный массив состояний, если нет, мы задаем полный массив состояний.

Код:

add_filter( 'woocommerce_states', 'wc_ie_counties_add_counties' );
function  wc_ie_counties_add_counties( $states ) {
// HERE your product IDS
$products_ids = array( 581, 590 );

$cart = WC()->cart; // The Cart object
$found = false;

$states_partial = array(
'Carlow' => 'Carlow',
'Cavan' => 'Cavan',
'Dublin' => 'Dublin'
);

$states_complete = array(
'Carlow' => 'Carlow',
'Cavan' => 'Cavan',
'Clare' => 'Clare',
'Cork' => 'Cork',
'Donegal' => 'Donegal',
'Dublin' => 'Dublin',
'Galway' => 'Galway',
'Kerry' => 'Kerry',
'Kildare' => 'Kildare',
'Kilkenny' => 'Kilkenny',
'Laois' => 'Laois',
'Leitrim' => 'Leitrim',
'Limerick' => 'Limerick',
'Longford' => 'Longford',
'Louth' => 'Louth',
'Mayo' => 'Mayo',
'Meath' => 'Meath',
'Monaghan' => 'Monaghan',
'Offaly' => 'Offaly',
'Roscommon' => 'Roscommon',
'Sligo' => 'Sligo',
'Tipperary' => 'Tipperary',
'Waterford' => 'Waterford',
'Westmeath' => 'Westmeath',
'Wexford' => 'Wexford',
'Wicklow' => 'Wicklow'
);

// Checking cart items
foreach( $cart->get_cart() as $cart_item ) {
if( in_array( $cart_item['product_id'], $products_ids ) ){
$found = true;
break;
}
}

$states['IE'] = $found ? $states_partial : $states_complete;

return $states;
}

Код помещается в файл function.php активной дочерней темы (или активной темы).

Это должно работать …


То же самое с категориями продуктов вместо идентификаторов продуктов (на основе кода автора):

add_action('woocommerce_states', 'my_check_category_in_cart');
function my_check_category_in_cart( $states ) {
// HERE your product categories
$products_categories = array( 'baths','curved-radiators','cabinets','mirrors','sinks',
'storage-units','toilets','vanity-units','column-radiators','curved-radiators',
'designer-radiators','flat-panel-radiators','heated-towel-radiators');

$is_in_cart = false;

// Loop through all products in the Cart
foreach ( WC()->cart->get_cart() as $cart_item ) {
// Check for product categories
if ( has_term( $products_categories, 'product_cat', $cart_item['product_id'] )  ) {
$is_in_cart = true;
break;
}
}

if ( $is_in_cart ) {

$states['IE']  = array(
'Carlow' => 'Carlow',
'Dublin' => 'Dublin',
'Kildare' => 'Kildare',
'Kilkenny' => 'Kilkenny',
'Laois' => 'Laois',
'Longford' => 'Longford',
'Louth' => 'Louth',
'Meath' => 'Meath',
'Offaly' => 'Offaly',
'Westmeath' => 'Westmeath',
'Wexford' => 'Wexford',
'Wicklow' => 'Wicklow'
);
// Display a custom notice
if( is_checkout() && WC()->customer->get_billing_country() == 'IE' )
wc_add_notice( 'One of the products below can only be delivered inside Leinster area', 'notice' );

} else {
$states['IE'] = array(
'Carlow' => 'Carlow',
'Cavan' => 'Cavan',
'Clare' => 'Clare',
'Cork' => 'Cork',
'Donegal' => 'Donegal',
'Dublin' => 'Dublin',
'Galway' => 'Galway',
'Kerry' => 'Kerry',
'Kildare' => 'Kildare',
'Kilkenny' => 'Kilkenny',
'Laois' => 'Laois',
'Leitrim' => 'Leitrim',
'Limerick' => 'Limerick',
'Longford' => 'Longford',
'Louth' => 'Louth',
'Mayo' => 'Mayo',
'Meath' => 'Meath',
'Monaghan' => 'Monaghan',
'Offaly' => 'Offaly',
'Roscommon' => 'Roscommon',
'Sligo' => 'Sligo',
'Tipperary' => 'Tipperary',
'Waterford' => 'Waterford',
'Westmeath' => 'Westmeath',
'Wexford' => 'Wexford',
'Wicklow' => 'Wicklow'
);
}
return $states;
}

Код помещается в файл function.php активной дочерней темы (или активной темы).

Теперь должно работать для вариантов продукта (на переменных продуктах) тоже.

1

Другие решения

Я использовал ваш код LoicTheAztec, и он отлично работает, но потом я понял, что мне понадобятся целые годы, чтобы добавить все продукты и обновлять их все время, пока я добавляю новый.

Таким образом, используя ваш код и немного другого, что я нашел. Я придумал этот, который делает что-то, но основанный на категориях.

add_action('woocommerce_states', 'my_check_category_in_cart');

function my_check_category_in_cart($states) {

// Set $cat_in_cart to false
$cat_in_cart = false;

// Loop through all products in the Cart
foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {

$product = $cart_item['data'];

$products_categ = array( 'baths','curved-radiators','cabinets','mirrors','sinks','storage-units','toilets','vanity-units','column-radiators','curved-radiators','designer-radiators','flat-panel-radiators','heated-towel-radiators');

// If Cart has category "download", set $cat_in_cart to true
if ( has_term( $products_categ, 'product_cat', $product->get_id() )  ) {
$prod_id = $product_id;
$cat_in_cart = true;
break;
}
}

// Do something if category "download" is in the Cart
if ( $cat_in_cart ) {

add_action('woocommerce_before_checkout_form', 'my_check_category_in_cart_msg');

function my_check_category_in_cart_msg() {
wc_print_notice( 'One of the products below can only be delivered inside Leinster area', 'notice' );
}
$states_complete = array(
'Carlow' => 'Carlow',
'Dublin' => 'Dublin',
'Kildare' => 'Kildare',
'Kilkenny' => 'Kilkenny',
'Laois' => 'Laois',
'Longford' => 'Longford',
'Louth' => 'Louth',
'Meath' => 'Meath',
'Offaly' => 'Offaly',
'Westmeath' => 'Westmeath',
'Wexford' => 'Wexford',
'Wicklow' => 'Wicklow'
);}

else{

$states_complete = array(
'Carlow' => 'Carlow',
'Cavan' => 'Cavan',
'Clare' => 'Clare',
'Cork' => 'Cork',
'Donegal' => 'Donegal',
'Dublin' => 'Dublin',
'Galway' => 'Galway',
'Kerry' => 'Kerry',
'Kildare' => 'Kildare',
'Kilkenny' => 'Kilkenny',
'Laois' => 'Laois',
'Leitrim' => 'Leitrim',
'Limerick' => 'Limerick',
'Longford' => 'Longford',
'Louth' => 'Louth',
'Mayo' => 'Mayo',
'Meath' => 'Meath',
'Monaghan' => 'Monaghan',
'Offaly' => 'Offaly',
'Roscommon' => 'Roscommon',
'Sligo' => 'Sligo',
'Tipperary' => 'Tipperary',
'Waterford' => 'Waterford',
'Westmeath' => 'Westmeath',
'Wexford' => 'Wexford',
'Wicklow' => 'Wicklow'
);

}

$states['IE'] = $states_complete;

return $states;

}

Я не знаю, правильный ли это подход, но он тоже работает.

огромное спасибо

0

По вопросам рекламы [email protected]