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;
Ваш комментарий будет первым