WordPress: добавляем в меню счетчик записей для таксономий
Для вывода списка всех рубрик в WordPress предусмотрена специальна функция – wp_list_categories()
. Однако, на мой взгляд, удобнее создавать этот список с помощью стандартного меню WordPress, которое редактируется на странице “Внешний вид – Меню” и выводится функцией wp_nav_menu()
.
Плюс такого подхода в том, что пункты можно расставить в нужном порядке, быстро добавить новые или убрать ненужные и, при необходимости, переименовать длинные названия в более короткие. Но при этом имеется и недостаток – базовый функционал меню не позволяет отображать количество записей в таксономиях.
К счастью, это легко исправить с помощью дополнительного кода. И это будет работать для любых таксономий, а не только для рубрик.
Я предлагаю два варианта решения: со счетчиком внутри и снаружи ссылки.
1-й вариант – счетчик записей выводится внутри тега ссылки
В файл functions.php вашей темы необходимо добавить следующий код:
function wp_nav_menu_item_count( $output, $item, $depth, $args ) {
if ( $args->theme_location == 'menu_name' ) {
if ( $item->type == 'taxonomy' ) {
$count = 0;
$terms = get_terms( array( 'taxonomy' => $item->object, 'pad_counts' => true ) );
foreach ( $terms as $term ) {
if ( $term->term_id == $item->object_id ) $count = $term->count;
}
if ( $count > 0 ) {
$out = '';
$split = str_split( $output, strpos( $output, '</a>' ) );
$out .= $split[0] . '<span class="menu-item-count">' . $count . '</span>' . $split[1];
$output = $out;
}
}
}
return $output;
}
add_action( 'walker_nav_menu_start_el', 'wp_nav_menu_item_count', 10, 4 );
2-й вариант – счетчик записей выводится после тега ссылки
В файл functions.php вашей темы необходимо добавить следующий код:
function wp_nav_menu_item_count( $output, $item, $depth, $args ) {
if ( $args->theme_location == 'menu_name' ) {
if ( $item->type == 'taxonomy' ) {
$count = 0;
$terms = get_terms( array( 'taxonomy' => $item->object, 'pad_counts' => true ) );
foreach ( $terms as $term ) {
if ( $term->term_id == $item->object_id ) $count = $term->count;
}
if ($count > 0 ) {
$output .= '<span class="menu-item-count">' . $count . '</span>';
}
}
}
return $output;
}
add_action( 'walker_nav_menu_start_el', 'wp_nav_menu_item_count', 10, 4 );
В результате для каждого пункта списка (если это элемент таксономии) будет добавлен тег <span class="menu-item-count"></span>
с количеством записей внутри него. При необходимости можете поменять класс этого тега в коде.
Хочу также обратить внимание на то, что в коде указано, что функционал добавляется только для конкретного меню, в данном случае с именем menu_name
. Это то имя, которое вы указываете при регистрации в теме меню функцией register_nav_menu()
, например:
register_nav_menu( 'menu_name', 'Верхнее меню' );
Оно же указывается в параметре theme_location
для функции wp_nav_menu()
.
Если вы хотите, чтобы код работал для всех меню, тогда удалите строку:
if ( $args->theme_location == 'menu_name' ) {
и скобку }
перед строкой:
return $output;
Комментарии (4)
Кстати хороший костыль, я раньше использовал счетчик прямо в меню функции, но этот способ почти на 10 запросов уменьшил работу сайта.
спасибо!
Подскажите а таксономия это в значении классификация или что?
Не понял вопрос.
Отлично! Воспользовалась вторым способом. Все работает!