Как правильно сделать так, что бы в каталоге не выводилось товары из определенной категории, но выводились в поиске?

Ссылка скопирована
1 ответ

Добрый день. Как правильно сделать так, что бы товары не выводились в каталоге, где все товары, но выводились в поиске? Пробовал через хук woocommerce_product_query_tax_query, но в таком случае не выводится и в поиске, что не подходит.

Дополнительно:

Показывайте код

  • ## Исключение из вывода товаров нужной метки или категории по слагу через хук woocommerce_product_query_tax_query
    add_filter( 'woocommerce_product_query_tax_query', 'wpcraft_exclude_products_by_wpqtq', 50, 2 );
    function wpcraft_exclude_products_by_wpqtq( $tax_query, $query ) {
    if( ! is_admin() ){
    $tax_query[] = array(
    'taxonomy' => 'product_cat', // 'product_tag' для тегов товаров
    'field' => 'slug',
    'terms' => array( 'furnitura' ), // 'slug_my_taxonomy' - слаг нужных таксономий через запятую (если несколько)
    'operator' => 'NOT IN'
    );
    }
    return $tax_query;
    }
  • boiko200, вам нужен pre_get_posts
    function exclude_cat_from_catalog( $query ) {     if ( $query->is_main_query() && ! is_admin() && is_shop() ) {         // тут ваш цикл     } } add_action( 'pre_get_posts',  'exclude_cat_from_catalog' );

    function exclude_cat_from_catalog( $query ) { if ( $query->is_main_query() && ! is_admin() && is_shop() ) { // тут ваш цикл } } add_action( 'pre_get_posts', 'exclude_cat_from_catalog' );

  • Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Игорь NetOps Ответ

    Вам нужно ограничить условие только каталогом, а не всеми WooCommerce-запросами. Фильтр woocommerce_product_query_tax_query с условием только ! is_admin() срабатывает слишком широко, поэтому категория исчезает и из поиска.

    Используйте основной запрос магазина и проверяйте именно is_shop() или нужные архивы каталога:

    add_action('woocommerce_product_query', function ($query) {
        if (is_admin() || is_search()) {
            return;
        }
     
        if (! is_shop()) {
            return;
        }
     
        $tax_query = (array) $query->get('tax_query');
     
        $tax_query[] = [
            'taxonomy' => 'product_cat',
            'field'    => 'slug',
            'terms'    => ['furnitura'],
            'operator' => 'NOT IN',
        ];
     
        $query->set('tax_query', $tax_query);
    });

    add_action('woocommerce_product_query', function ($query) { if (is_admin() || is_search()) { return; } if (! is_shop()) { return; } $tax_query = (array) $query->get('tax_query'); $tax_query[] = [ 'taxonomy' => 'product_cat', 'field' => 'slug', 'terms' => ['furnitura'], 'operator' => 'NOT IN', ]; $query->set('tax_query', $tax_query); });

    Если нужно скрыть товары также на архивах некоторых категорий, добавьте условие is_product_category(). Если нужно скрыть только на странице «Магазин», оставьте только is_shop().

    Отдельно проверьте виджеты, блоки «похожие товары» и кастомные WP_Query: они могут использовать не основной запрос. Для них потребуется отдельный фильтр или аргументы конкретного блока. Поиск не трогайте: is_search() должен выходить из функции до добавления NOT IN.

    Перед внедрением на рабочем сайте проверьте решение на копии или хотя бы сделайте резервную копию изменяемого файла. После правки включите отображение ошибок, откройте проблемную страницу в обычном и приватном окне, проверьте консоль браузера и логи PHP. Если задача связана с WordPress, WooCommerce или ACF, дополнительно проверьте поведение после очистки кэша и после выхода из админки: часть ошибок видна только для незалогиненного пользователя.

    Если код работает только в одном шаблоне, лучше не оставлять его разрозненно в нескольких файлах. Вынесите повторяемую логику в функцию, небольшой плагин или template part, а в шаблоне оставьте только вызов. Так проще поддерживать решение после обновления темы, плагинов и PHP.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно