Вопрос или проблема
Я исследую этот вопрос и пока не добился успеха.
У меня есть магазин WooCommerce с основным меню, отображающим категории продуктов (product_cat) и бренды (yith_product_brand), которые являются пользовательской таксономией.
Я хочу скрыть категории и бренды, если они пустые. Знаете ли вы, как это сделать, используя плагин или добавив функцию/фильтр в файл functions.php? Если да, буду очень благодарен за помощь.
Заранее спасибо.
Не уверен насчет пользовательской таксономии, однако я использовал этот код ранее, чтобы удалить пустые категории. Вы можете добавить его в functions.php.
add_filter( 'wp_get_nav_menu_items', 'nav_remove_empty_category_menu_item', 10, 3 );
function nav_remove_empty_category_menu_item ( $items, $menu, $args ) {
global $wpdb;
$nopost = $wpdb->get_col( "SELECT term_taxonomy_id FROM $wpdb->term_taxonomy WHERE count = 0" );
foreach ( $items as $key => $item ) {
if ( ( 'taxonomy' == $item->type ) && ( in_array( $item->object_id, $nopost ) ) ) {
unset( $items[$key] );
}
}
return $items;
}
function remove_empty_category_from_menu_item( $items, $menu, $args ) {
// Получить все категории, которые имеют продукты
$categories_with_products = get_categories( array(
'taxonomy' => 'product_cat',
'hide_empty' => true,
'hierarchical' => true,
) );
// Извлечь ID категорий и добавить их в массив $categories_to_keep
foreach ( $categories_with_products as $category ) {
$categories_to_keep[] = $category->term_id;
}
// Пройтись по каждому элементу меню
foreach ( $items as $key => $item ) {
// Проверить, является ли элемент меню типом 'taxonomy' и объектом 'product_cat'
if ( 'taxonomy' == $item->type && 'product_cat' == $item->object ) {
// Если object_id элемента меню не в массиве $categories_to_keep, удалить его
if (!in_array( $item->object_id, $categories_to_keep ) ) {
// удалить из меню
unset( $items[$key] );
}
}
}
return $items;
}
add_filter( 'wp_get_nav_menu_items', 'remove_empty_category_from_menu_item', 10, 3 );
Ответ или решение
Для решения проблемы скрытия пустых категорий продуктов и терминов таксономии из меню в WooCommerce, необходимо использовать фильтры и функции, которые позволяют модифицировать элементы меню динамически. В данной статье мы обсудим, как это можно сделать, включая необходимые шаги, которые можно выполнить через добавление кода в файл functions.php
вашей темы или использование плагина.
1. Подход к решению
Для того чтобы скрывать пустые категории и бренды из меню, мы будем использовать хук wp_get_nav_menu_items
, который позволяет нам изменять список элементов меню перед тем, как они отображаются на сайте.
2. Скрытие пустых категорий
Для того чтобы скрыть пустые категории, можно воспользоваться следующей функцией. Она проверяет, есть ли продукты в каждой категории, и удаляет из меню те, которые пусты.
Код для добавления в functions.php
add_filter('wp_get_nav_menu_items', 'remove_empty_category_from_menu_item', 10, 3);
function remove_empty_category_from_menu_item($items, $menu, $args) {
// Получаем все категории товаров с продуктами
$categories_with_products = get_categories(array(
'taxonomy' => 'product_cat',
'hide_empty' => true,
'hierarchical' => true,
));
// Извлекаем идентификаторы категорий и добавляем их в массив $categories_to_keep
$categories_to_keep = array();
foreach ($categories_with_products as $category) {
$categories_to_keep[] = $category->term_id;
}
// Пробегаем по каждому элементу меню
foreach ($items as $key => $item) {
// Проверяем, является ли элемент меню типом 'taxonomy' и объектом 'product_cat'
if ('taxonomy' == $item->type && 'product_cat' == $item->object) {
// Если идентификатор объекта меню не присутствует в массиве $categories_to_keep, удаляем его
if (!in_array($item->object_id, $categories_to_keep)) {
unset($items[$key]);
}
}
}
return $items;
}
3. Скрытие пустых брендов (если применимо)
Если вы также хотите скрывать пустые бренды (т.е. термины вашей пользовательской таксономии yith_product_brand
), вы можете использовать аналогичный код. Вот пример функции для скрытия пустых брендов:
add_filter('wp_get_nav_menu_items', 'remove_empty_brands_from_menu_item', 10, 3);
function remove_empty_brands_from_menu_item($items, $menu, $args) {
// Получаем все бренды, которые имеют продукты
$brands_with_products = get_terms(array(
'taxonomy' => 'yith_product_brand',
'hide_empty' => true,
));
// Извлекаем идентификаторы брендов и добавляем их в массив $brands_to_keep
$brands_to_keep = array();
foreach ($brands_with_products as $brand) {
$brands_to_keep[] = $brand->term_id;
}
// Проверяем элементы меню
foreach ($items as $key => $item) {
// Проверяем, является ли элемент меню типом 'taxonomy' и объектом 'yith_product_brand'
if ('taxonomy' == $item->type && 'yith_product_brand' == $item->object) {
// Если идентификатор объекта меню не присутствует в массиве $brands_to_keep, удаляем его
if (!in_array($item->object_id, $brands_to_keep)) {
unset($items[$key]);
}
}
}
return $items;
}
4. Заключение
Применив вышеуказанные функции в файл functions.php
вашей темы, вы сможете автоматически скрывать пустые категории и бренды в меню вашего WooCommerce магазина. Это не только улучшит пользовательский интерфейс, но и сделает навигацию по вашему сайту более интуитивно понятной.
Если вы не уверены в своих навыках в редактировании кода, вы также можете рассмотреть возможность использования специализированных плагинов, которые могут предоставлять аналогичные возможности, но с использованием графического интерфейса.
Следуя этим рекомендациям, вы сможете эффективно управлять отображением элементов навигации на вашем сайте, повышая его удобство для пользователей.