[РЕШЕНО] Как мне настроить это, чтобы изменить страну, доступную на странице оформления заказа, по категории продукта, а не по конкретным продуктам?
Я пытаюсь это:
/* HIDE U.S. as a country destination if category is "Canada Only" */
add_filter( 'woocommerce_countries', 'products_disable_country', 10, 1 );
function products_disable_country( $countries ) {
if ( is_cart() || is_checkout() ) {
$product_cat = array(195);
foreach( WC()->cart->get_cart() as $item ){
if ( in_array( $item['product_cat'], $product_cat ) ){
unset($countries["US"]);
return $countries;
}
}
}
return $countries;
}
Но кубиков пока нет...
В качестве основы использовал этот код ответа:
Удалить страну из разрешенных стран, когда определенные товары находятся в корзине WooCommerce
Изменить (добавлено несколько скриншотов):
Продукт относится к категории «Только для Канады»: Lemon Tarts.
Идентификатор категории для этого равен 195:
Оформление заказа по-прежнему показывает США в качестве опции в разделе доставки:
Спасибо, Лоик! Ваше последнее обновление сработало отлично, см. ниже:
Ты звезда!
🤔 А знаете ли вы, что...
PHP поддерживает многопоточность и многозадачность.
Обновление (заменен первоначальный крючок «woocommerce_countries»)
Чтобы проверить, присвоен ли продукт (или предмет) термину категории продукта, вы должны использовать has_term()
условную функцию WordPress, например:
add_filter( 'woocommerce_countries_allowed_countries', 'allowed_countries_for_product_category', 10, 1 );
function allowed_countries_for_product_category( $countries ) {
// Only on cart and checkout pages
if ( is_cart() || ( is_checkout() && !is_wc_endpoint_url() ) ) {
$country_code = 'US'; // Define the targeted country code to disable
$targeted_terms = array(195); // Define your category(ies) (terms IDs, slugs or names)
$category_found = false; // Initializing
// Loop through cart items
foreach ( WC()->cart->get_cart() as $item ) {
// Check if one of the targeted categories is assigned
if ( has_term($targeted_terms, 'product_cat', $item['product_id']) ) {
$category_found = true; // Tag as found
break; // Stop the loop
}
}
// Remove the targeted country if any targeted category is found
if ( $category_found && isset($countries[$country_code]) ){
unset($countries[$country_code]);
}
}
return $countries;
}
Код находится в файле function.php вашей дочерней темы (или в плагине). Проверено и работает.
Для параметра «Доставка в» с таргетингом только на страны доставки используйте дополнительно:
add_filter( 'woocommerce_countries_shipping_countries', 'allowed_countries_for_product_category', 10, 1 );
Связано: Удалить страну из разрешенных стран, когда определенные продукты находятся в корзине WooCommerce
Вот как это можно реализовать:
Шаг 1. Подключитесь к фильтру woocommerce_countries_allowed_countries. Вы будете использовать фильтр woocommerce_countries_allowed_countries, чтобы удалить страну из списка разрешенных стран, когда в корзине присутствует определенная категория продуктов.
Шаг 2. Проверьте корзину на наличие конкретной категории товаров. Вы просматриваете товары в корзине, чтобы проверить, принадлежит ли какой-либо из них к конкретной категории, которая вас интересует.
Шаг 3. Удалите страну Если категория найдена в корзине, вы удаляете страну из массива разрешенных стран.
add_filter( 'woocommerce_countries_allowed_countries', 'remove_country_for_specific_category' );
add_filter( 'woocommerce_countries_shipping_countries', 'remove_country_for_specific_category' );
function remove_country_for_specific_category( $countries ) {
// Define the category you want to check for
$category_slug = 'your-category-slug'; // Replace with your category slug
// Define the country code to remove (e.g., 'US' for the United States)
$country_to_remove = 'US';
// Check if the cart contains a product from the specific category
if ( is_cart_contains_category( $category_slug ) ) {
// Remove the country from the allowed countries list
if ( isset( $countries[ $country_to_remove ] ) ) {
unset( $countries[ $country_to_remove ] );
}
}
return $countries;
}
function is_cart_contains_category( $category_slug ) {
// Loop through cart items and check for the category
foreach ( WC()->cart->get_cart() as $cart_item ) {
if ( has_term( $category_slug, 'product_cat', $cart_item['product_id'] ) ) {
return true;
}
}
return false;
}
Фильтр woocommerce_countries_allowed_countries: этот фильтр изменяет список разрешенных стран для выставления счетов. Второй фильтр, woocommerce_countries_shipping_countries, изменяет список стран доставки.
Проверка категории: функция is_cart_contains_category() перебирает все элементы в корзине и проверяет, принадлежат ли они к указанной категории (ваша-категория-слаг).
Удаление страны: если в корзине найден товар из указанной категории, страна (в данном примере США) удаляется из списка разрешенных стран.
Настройка: $category_slug: замените «ваша-категория-слаг» фактическим ярлыком категории продукта, которую вы хотите проверить.
$country_to_remove: замените «США» кодом ISO 3166-1 альфа-2 страны, которую вы хотите удалить.
Вариант использования: Ограничить доставку: это может быть полезно, если определенные продукты не могут быть отправлены в определенные страны из-за правил, ограничений на доставку или по другим причинам. Этот код следует добавить в файл function.php вашей темы.