Как скрыть товары категории или убрать ее целиком из Woocommerce каталога
В заметке про раздельный вывод подкатегорий и товаров в комментах задали вопрос по относительно похожей теме и попросили рассказать как скрыть категорию Woocommerce со страницы магазина. Сам с этой задачей я столкнулся только сейчас, поэтому решил детально разобраться в вопросе и выделить все в отдельный пост.
Как оказалось, тут есть множество нюансов: кому-то надо просто не выводить определенные рубрики, другим требуется убирать всю продукцию из каталога, третьи пытаются изменить вывод виджета и т.п.
Содержимое статьи:
- Убираем Woocommerce категории из каталога.
- Скрываем товары из определенной категории.
- Плагин Hide Categories On Shop Page.
Во-первых, следует заметить, что для плагина Вукоммерс есть разные способы вывода его элементов. Они задаются в Настройщике темы, находящемся в разделе админки «Внешний вид». Выбираете в этом инструменте пункт «Woocommerce» — «Каталог товаров».
Здесь в первом параметре у вас может быть отмечено отображение разделов магазина ЛИБО сразу всей продукции. В зависимости от этого и возникают разные ситуации/задачи, описанные ниже.
Второй момент, необходимый для корректной работы хаков, — задание глобальной страницы магазина/каталога. Это делается в настройках Woocommerce в разделе “Товары” (сама страница, разумеется, создается чуть ранее).
Как убрать категории Woocommerce из каталога
Это нужно, когда пользователь попадает в каталог продукции и видит только категории без товаров. Допустим, некоторые из них нам и нужно убрать. По сути, существует два разных подхода.
Вариант1 — через сниппет
Для этого нам пригодится хак, который уже несколько лет гуляет по просторам интернета. По сути, у нас задача противоположна выводу пустых подкатегорий товаров но в данном случае мы работаем с конкретной рубрикой, заданной вручную. Добавляйте код в файл функций functions.php (или custom-function):
add_filter( 'get_terms', 'organicweb_exclude_category', 10, 3 ); function organicweb_exclude_category( $terms, $taxonomies, $args ) { $new_terms = array(); // if a product category and on a page if ( in_array( 'product_cat', $taxonomies ) && ! is_admin() && is_page() ) { foreach ( $terms as $key => $term ) { // Enter the name of the category you want to exclude in place of 'uncategorised' if ( ! in_array( $term->slug, array( 'uncategorised' ) ) ) { $new_terms[] = $term; } } $terms = $new_terms; } return $terms; } |
Внимание! Во-первых, замените значение «uncategorised» на нужный вам slug, который можете подсмотреть в разделе админки «Товары» — «Категории».
Еще один важный нюанс касается условных операторов, используемых в сниппете (строка с if) — там вы можете увидеть is_page, который применит ваш код ко всем WP записям типа «страница». Если нужно, можете заменить его или добавить в данную конструкцию is_shop (он обозначает непосредственно каталог магазина).
Особенность is_page в том, что условие будет срабатывать и на обычных страничках сайта, например, где товары/категории выводятся через шорткод (product_category). Кстати, рубрика будет все еще доступна по прямой ссылке, она исключается только из списков.
Вариант2 – через CSS стили
Тут все предельно просто, поэтому такой подход мне лично нравится больше. Хотя на самом деле информация скрывается только визуально от посетителей, в HTML ссылки остаются. Со стилями также есть два способа все реализовать – вы можете использовать псевдоклассы по типу first-child или там был еще какой-то, позволяющий указать конкретный по счету элемент, но я придумал следующее. Размещаем в файле функций код:
add_filter( 'product_cat_class', 'filter_product_cat_class', 10, 3 ); function filter_product_cat_class( $classes, $class, $category ){ // Only on shop page if( is_shop() ) $classes[] = 'custom_cat_'.$category->slug; return $classes; } |
Он модифицирует карточки категорий в каталоге магазина, добавляя к стандартному/одинаковому классу название категории. После этого в HTML будут классы вида: «custom_cat_uncategorized», «custom_cat_presents», «custom_cat_cat1» (формат = общий блок + slug рубрики). И уже тогда вы сможете добавить в свой файл стилей что-то типа:
.custom_cat_uncategorized { display: none !important; } |
Надеюсь, логика вам понятна, а названия классов, конечно, следует подставлять свои. Кстати, если в главном каталоге выводится продукция, то тут следует применять код (исходники тут):
add_filter( 'post_class', 'filter_product_post_class', 10, 3 ); function filter_product_post_class( $classes, $class, $product_id ){ // Only on shop page if( is_shop() ) $classes[] = 'custom_prod'; return $classes; } |
Решение для виджета
Второй хак от этого автора позволяет удалить определенный раздел в виджете модуля. Берете код, представленный ниже, указываете его ID вместо цифры 30 (которая используется для примера) и добавляете все это в functions.php:
add_filter( 'woocommerce_product_categories_widget_args', 'organicweb_exclude_widget_category' ); function organicweb_exclude_widget_category( $args ) { // Enter the id of the category you want to exclude in place of '30' $args['exclude'] = array('30' ); return $args; } |
Посмотреть ID сможете в адресной строке, когда перейдете к редактированию того или иного элемента или при наведении на него (цифра отображается в статусной строке браузера снизу слева). Если создаете WooCommerce меню категорий через обычную функциональность WordPress, то там все легко делается вручную.
Как скрыть товары из категории Woocommerce
Эта задача актуальна, если у вас настроено отображение не категорий/производителей, а сразу всей продукции магазина. Хак находим на официальном сайте с документацией Вукоммерс.
function custom_pre_get_posts_query( $q ) { $tax_query = (array) $q->get( 'tax_query' ); $tax_query[] = array( 'taxonomy' => 'product_cat', 'field' => 'slug', 'terms' => array( 'clothing' ), // Don't display products in the clothing category on the shop page. 'operator' => 'NOT IN' ); $q->set( 'tax_query', $tax_query ); } add_action( 'woocommerce_product_query', 'custom_pre_get_posts_query' ); |
Важно! Тут вместо «clothing» опять же подставляете свой slug, причем если вам нужно исключить несколько рубрик, то в сниппете, указанном выше, сроку с параметром ‘terms’ надо заменить на следующую (не забудьте запятую в конце):
'terms' => array( 'chaj','hyson' ), |
Проблема метода
Заключается в том, что заданные товары Woocommerce скрыты будут и на страницах разделов, что не совсем хорошо. Дабы этого не случалось, теоретически, можно добавить условие в начале и в конце функции
function custom_pre_get_posts_query( $q ) { if ( is_shop() && !is_admin() ) { .... код сниппета .... } } |
Мне лично избавиться от проблемы помогло, хотя я бы все это еще разок-другой потестировал перед внедрением.
Hide Categories On Shop Page
В принципе, для решения первой из наших задач есть еще и специальный модуль. Ищите по названию или здесь. После установки в настройках Вукоммерс во вкладке товаров появится новая опция:
Через запятую вводите slug скрываемых разделов. Кстати, если у вас для этой задачи используется конкретная отдельная страница, то нужно будет немного подправить код плагина:
1. Найти 127-ую строку и раскомментировать ее (удалить //).
//$mwd_opt4 = in_array( 'product_cat', $taxonomies ) && ! is_admin() && is_page('YOUR_PAGE_SLUG'), |
2. Затем найти 129-тую строку и там часть текста:
/*|| $mwd_opt4*/ |
заменить на
|| $mwd_opt4 |
В принципе, если что-то непонятно можете глянуть официальную веб-страничку плагина + посмотреть раздел поддержки. Обновлялся он последний раз 1 год назад, скачали — чуть больше 2000 человек. Честно, мне кажется, проще и безопаснее разобраться со сниппетами нежели ставить чужое решение.
комментариев 13 к статье “Как скрыть товары категории или убрать ее целиком из Woocommerce каталога”
Блог Wordpress Inside поможет вам научиться работать в вордпресс, закрепить и расширить имеющиеся знания. Плагины и шаблоны, разные хаки и функции wp, оптимизация и безопасность системы – все это и намного больше вы сможете найти на страницах нашего проекта!
Если хотите быстро и оперативно получать последние новости и статьи, то рекомендуем подписаться на обновления блога:
- Як сховати відсутні товари в Woocommerce шорткодах та схожих товарах
- Сервіс AdMaven + плагін для монетизації трафіка на WordPress сайтах
- Плагіни для створення стрічки новин з біжучим рядком в WordPress
- Як змінити розміщення кнопки оформлення замовлення в WooCommerce
- Плагін WHWS Display In Stock Products First – відображення товарів в наявності першими
- Підписка MonsterONE: чи варто використовувати цей сервіс у 2023 році? (+5 продуктів, які треба скачати в першу чергу)
- Онлайн генератор ссылок на мессенджеры для WordPress и не только
- WooCommerce (46)
- Безопасность (12)
- Видео (6)
- Виджеты (28)
- Возможности (141)
- Вопрос-ответ (6)
- Начинающим (52)
- Новости (46)
- Оптимизация (23)
- Плагины (246)
- Сервисы (87)
- Хаки и секреты (87)
- Шаблоны (45)
- Дизайн Мания - о веб-дизайне и не только.
- Tod's Blog - все про заработок онлайн.
- Вебдванольные заметки - обзоры веб-сервисов.
- Советы по выбору холодильника LG с технологией No Frost
- Зачем нужны Wi-Fi ретрансляторы и как выбрать подходящую модель
- Введение в онлайн-казино Slotor777: многообразие игр и привлекательные бонусы
- Необходимость использования облачного хранилища в наше время, что важно и как выгодно?
- Спрощення процесу звітності за допомогою програми BAS Бухгалтерія
- Технологія підключення інтернету GPON та її переваги
- За що гравці найбільше цінують Lineage 2
- Для каких проектов нужна аренда виртуального сервера и что такое VPS
Круто, что в блоге много статей про WooCommerce.. если бы их все в одном месте собрать еще..
Андрей, в горизонтальном меню есть одноименный раздел + рядом еще и карта сайта.
Добрый день!
Подскажите, как скрыть и категории товаров и товары. Сделал отдельную страницу для главной страницы магазина, чтобы ее кастомизировать, но категории все равно отображаются.
Илья, по идее, в файле шаблона магазина можно попробовать убрать вывод основного контента (the_content), тогда стандартное содержимое не будет выводиться, а только то, что вы задаете в конструкторе. Но вообще тут многое зависит от самого шаблона. Возможно, для шаблона страницы page.php надо будет добавлять условия is_shop() для которого скрывать вывод контента the_content.
Я, если честно, с такой ситуацией не сталкивался, то ли мне везло с шаблонами, то ли не правильно понял суть проблемы.
Я что-то не могу разобраться, так как не силен в коде))
Ну вот смотри, если нам нужно убрать одну категори, то моно прописать такой код:
/* Убираем категорию «drгgoe» (Указываем необходимую категорию в конце кода) со страницы магазина */
add_filter( ‘get_terms’, ‘organicweb_exclude_category’, 10, 3 );
function organicweb_exclude_category( $terms, $taxonomies, $args ) {
$new_terms = array();
// if a product category and on a page
if ( in_array( ‘product_cat’, $taxonomies ) && ! is_admin() && is_shop() ) {
foreach ( $terms as $key => $term ) {
// Enter the name of the category you want to exclude in place of ‘uncategorised’
if ( ! in_array( $term->slug, array( ‘drugoe’) ) ) {
$new_terms[] = $term;
}
}
$terms = $new_terms;
}
return $terms;
}
Можно так все категории добавлять, но это ж глупо. Я думаю, что тут можно немного изменить код, чтобы вообще все категории убрать со страницы магазина.
Не подскажешь?
Либо да, как ты изначально предложил — через functions.php можно прописать, что-то типа:
Если это страница магазина, то удалить вывод всего контента.
Только со знанием кода беда. Вообще не могу сам написать, сорян)
Илья, попробуй сделать так — https://www.businessbloomer.com/woocommerce-remove-loop-shop-page/ (или еще загуглить woocommerce hide all products from shop page)
Потрясно! Предложенный вариант сработал. А я искал битый час и ничего не нашел)
Спасибо, Tod! Ты мой супергерой))
Здравствуйте, а как скрыть товары определенной категории, чтоб в дочерних категорий товары не пропадали?
Денис, если честно, не совсем понял вопрос, нужно как-то более детально и на примере расписать.
Здравствуйте! У меня несколько иная задача. Когда размещаешь товар в подкатегории (например, Домики), то товар автоматически добавляется и в родительскую категорию (Собаки). Пример: https://i.imgur.com/DJ7tazl.png
В списке категорий товаров сайдбара родительские категории тоже имеют ссылки на страницу с выводом всего содержимого подкатегорий. Это нехорошо, так как в сайдбаре выводятся при этом все имеющиеся фильтры атрибутов.
Можно ли каким-то образом убрать ссылки на родительские категории товаров в Сайдбаре (виджет Категории) либо сделать так, чтобы фильтры выводились только в подкатегориях, но не в родительских?
Дима, удалять родительские категории из виджета, наверное, будет не совсем логично, поэтому лучше смотреть в сторону второго варианта. Тут все зависит от того какой плагин для фильтров используете и как именно они выводятся. Если виджетами, то есть плагин Widget Logic для задание условий отображения виджетов и, по идее, там можно исключить/показать нужный контент с помощью условгого оператора is_product_category для Woocommerce.
Добрый день, а как скрыть определенные товары из определенной категории Woocommerce?