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)

  1. Max
    3 октября 2018 г. в 03:25

    Кстати хороший костыль, я раньше использовал счетчик прямо в меню функции, но этот способ почти на 10 запросов уменьшил работу сайта.
    спасибо!

  2. 22 октября 2018 г. в 12:07

    Подскажите а таксономия это в значении классификация или что?

    1. 22 октября 2018 г. в 13:23 / ответ на коммент Макс

      Не понял вопрос.

  3. 20 ноября 2018 г. в 17:08

    Отлично! Воспользовалась вторым способом. Все работает!

Ваш комментарий

Жирный текст

Ссылка

Цитата

Внутристрочный код

CSS-код

HTML-код

JavaScript-код

PHP-код