Удалить страну из разрешенных стран, если определенная категория продуктов находится в корзине WooCommerce

[РЕШЕНО] Как мне настроить это, чтобы изменить страну, доступную на странице оформления заказа, по категории продукта, а не по конкретным продуктам?

Я пытаюсь это:

/* 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 поддерживает многопоточность и многозадачность.


2
75
2

Ответы:

Решено

Обновление (заменен первоначальный крючок «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 вашей темы.