wp_list_categories() — вывод категорий в виде списка

Эта функция довольно часто используется в темах WordPress для создания меню. А так же с её помощью очень удобно выводить виджет со списком категорий в сайдбаре. Когда я говорю список, я имею ввиду HTML-список.

Если же вам нужно вывести рубрики к текущей записи или к записи с указанным ID — воспользуйтесь функцией the_category() или get_the_category().

А теперь рассмотрим простейший пример:

wp_list_categories('orderby=name');

Этот код выведет список категорий, отсортированных по имени. Вот как это будет выглядеть в HTML, самый обычный список со ссылками:

<li class="categories">Рубрики
<ul>
	<li class="cat-item cat-item-1">
		<a href="http://ваш_сайт.com/category/plugins" title="Просмотреть все записи в рубрике &laquo;Плагины&raquo;">Плагины</a> 
	</li> 
	<li class="cat-item cat-item-3">
		<a href="http://ваш_сайт.com/category/themes" title="Просмотреть все записи в рубрике &laquo;Темы&raquo;">Темы</a> 
	</li> 
</ul>
</li>

Теперь добавим несколько параметров

wp_list_categories('orderby=name&style=none&title_li=');

Оставляем сортировку по имени, но теперь категории будут выводиться не через <li>-список, а просто в виде ссылок (каждая с новой строки), пустой параметр title_li означает, что не нужно добавлять заголовок. Вот, как это выглядит в HTML-коде:

<a href="http://ваш_сайт.com/category/plugins" title="Просмотреть все записи в рубрике &laquo;Плагины&raquo;">Плагины</a><br />
<a href="http://ваш_сайт.com/category/themes" title="Просмотреть все записи в рубрике &laquo;Темы&raquo;">Темы</a><br />

Понятно, что чем больше вы засунете параметров в скобки, тем труднее будет во всем этом разобраться в дальнейшем, поэтому есть ещё один вариант записи.

Сначала идёт присвоение значений массиву $args, а потом он просто указывается в скобках.

$args = array(
	'orderby' => 'name',
	'style' => 'none',
	'title_li' => ''
);
 
wp_list_categories($args);

Теперь посмотрим, какие ещё могут быть параметры у функции:

show_option_all
(строка) Нужно ли добавить ссылку на главную страницу? Можно указать любое значение, например ‘На главную’ — оно и будет анкором для ссылки.

orderby
(строка) Каким образом вы хотите отсортировать категории?

  • ID — по id категории (по умолчанию)
  • name — по имени
  • slug — по ярлыку
  • count — по числу записей

order
(строка) Устанавливает порядок сортировки.

  • asc — по возрастанию (по умолчанию)
  • desc — по убыванию

style
(строка) Стиль вывода списка категорий.

  • list — в виде <li>-списка (по умолчанию)
  • none — в виде ссылок, разделенных тегом

show_count
(логическое) Указывает в скобках количество постов в каждой из рубрик.

  • 1 — да
  • 0 — нет (по умолчанию)

hide_empty
(логическое) Нужно ли исключить пустые рубрики (категории) из списка?

  • 1 — да (по умолчанию)
  • 0 — нет

use_desc_for_title
(логическое) Нужно ли использовать описание рубрик в атрибуте title для ссылок, если оно имеется. (пример: <a title="Описание_категории" href="…)

  • 1 — да (по умолчанию)
  • 0 — нет

child_of
(целое число) Нужно указать id рубрики, подрубрики которой вы хотите вывести.

feed
(строка) Рядом с каждой категорией вставляет ссылку на RSS-ленту. Указанное значение будет анкором этих ссылок.

feed_image
(строка) Аналогичен предыдущему параметру, но только вставляет ссылку с картинкой. В качестве значения укажите адрес картинки.

feed_type
(строка) Тип RSS-ленты.

  • atom
  • rdf
  • rss
  • rss2 (по умолчанию)

exclude
(целое число) Перечислите через запятую id категорий, которые вы хотите исключить из списка.

exclude_tree
(целое число) Исключить рубрику и все её подрубрики из списка. Работает только при выключенном hierarchical.

include
(целое число) Укажите через запятую категории (их id), которые вы хотите включить в список.

hierarchical
(логическое) Нужно ли создавать вложенные списки для подкатегорий?

  • 1 — да (по умолчанию)
  • 0 — нет

title_li
(строка) Заголовок для списка категорий. По умолчанию __( ‘Categories’ ). То есть в русском WordPress это будет переведено в «Рубрики». Оставьте параметр пустым, чтобы избавиться от заголовка.

number
(целое число) Сколько категорий нужно отобразить в списке?

echo
(логическое) Вывод списка категорий или сохранение результата в переменную.

  • 1 — да (по умолчанию)
  • 0 — нет

depth
(целое число) Количество уровней вложенности списка.

  • 0 — неограниченно (по умолчанию)
  • -1 — без уровней вложенности, параметр hierarchical игнорируется
  • n — любое целое число

taxonomy
(строка) Выберите таксономию для вывода:

  • category — рубрики (по умолчанию)
  • taxonomy — любая зарегистрированная таксономия

current_category
(целое число) Укажите id категории из списка, для которой вы хотите добавить css-класс «current-cat». По умолчанию он добавляется к той категории, в которой в данный момент находится пользователь.

Пример:

$args = array(
	'show_option_all'    => 'Перейти на главную',
	'orderby'            => 'name',
	'order'              => 'desc',
	'style'              => 'list',
	'show_count'         => 1,
	'hide_empty'         => 0,
	'use_desc_for_title' => 1,
	'feed'               => 'RSS',
	'exclude'            => '4,3',
	'exclude_tree'       => 7,
	'hierarchical'       => 1,
	'title_li'           => 'Мои рубрики',
	'echo'               => 1,
	'depth'              => 0
);
 
wp_list_categories($args);

Вот как это будет выглядеть в итоге:

<li class="categories">Мои рубрики
<ul>
	<li>
		<a href="http://ваш_сайт.com">Перейти на главную</a>
	</li>
	<li class="cat-item cat-item-2">
		<a href="http://ваш_сайт.com/category/ярлык_рубрики" title="описание_рубрики">название_рубрики</a> (<a href="http://ваш_сайт.com/category/ярлык_рубрики/feed" title="RSS">RSS</a>) (0)
	</li> 
	<li class="cat-item cat-item-1">
		<a href="http://ваш_сайт.com/category/ярлык_рубрики" title="описание_рубрики">название_рубрики</a> (<a href="http://ваш_сайт.com/category/ярлык_рубрики/feed" title="RSS">RSS</a>) (1)
		<ul class='children'> 
			<li class="cat-item cat-item-5"><a href="http://ваш_сайт.com/category/ярлык_рубрики/ярлык_рубрики" title="описание_рубрики">название_рубрики</a> (<a href="http://ваш_сайт.com/category/ярлык_рубрики/ярлык_рубрики/feed" title="RSS">RSS</a>) (0)
			</li> 
		</ul> 
	</li> 
</ul>
</li>

Миша

В последние годы я долго не знал, что мне делать с сайтом misha.blog, ведь он практически не приносит никакого профита, но недавно я осознал, что моя миссия – способствовать распространению WordPress. Ведь WordPress – это лучший движок для разработки сайтов – как для тех, кто готов использовать заложенную структуру этой CMS, так и для тех, кто предпочитает headless решения.

Сам же я впервые познакомился с WordPress в 2009 году. Организатор WordCamp. Преподаватель в школах Epic Skills и LoftSchool.

Если вам нужна помощь с вашим сайтом или может даже разработка с нуля на WordPress / WooCommerce — пишите. Я и моя команда сделаем вам всё на лучшем уровне.

Комментарии 47

  • JeJey 1 ноября 2011 #

    а что такое анкор?

    • Миша 1 ноября 2011 #

      это текст ссылки) например, <a href="адрес_ссылки">анкор<a>

  • sanches812 8 сентября 2012 #

    Я думаю, что сайт сделан на уровне! Приятно находится! На по гугл +1! )

    И вопрос: а как вывести заголовок текущей категории? в single.php

    • Миша 10 сентября 2012 #

      спс) используй функцию the_category() например, есть и другие варианты, но там побольше кода уже)

  • Александр 10 апреля 2013 #

    А как указать путь к картинке категории, параметр feed_image ?

  • Александр 10 апреля 2013 #

    И как сделать, чтобы картинка выводилась перед названием категории, а не за ней?

  • Сергей 31 августа 2013 #

    Подскажите, как добавить доп. теги к элементам списка? Я, к примеру, хочу выделить категории заголовком h2. before_link и after_link здесь не работают.

    • Миша 31 августа 2013 #

      как вариант:

      $categories = wp_list_categories("style=none&echo=0&title_li=");
      echo '<h2>' . str_replace("<br />", "</h2>\n<h2>", $categories) . '</h2>';
  • sergey666 13 апреля 2014 #

    как к аргументу show_count присвоить свой стиль css?

  • Антон 18 марта 2015 #

    Добрый день.

    Тоже интересует вопрос – как присвоить стиль к show_count?

    • Миша 19 марта 2015 #

      Добрый день!
      Тут можно поступить так - присваиваете стиль к элементу li (он же и будет применяться для show_count), а потом отдельно для элемента а.

  • Антон 19 марта 2015 #

    Михаил, я нашел на разработанном вами сайте пример, что именно требуется – http://rghost.ru/78nZ6gFFc. Как это реализовать:

    "Название рубрики"
    (число)

    Я правильно понимаю, что требуется править файл category-template.php?

    • Миша 20 марта 2015 #

      Ни в коем случае не надо, используйте функцию get_categories().

      • Антон 20 марта 2015 #

        А почему? Якобы после обновления движка все слетит? Я просто уже сделал у себя на сайте. А как использовать get_categories() я не знаю. Может на статью кинете ссылку - разберусь с этой темой?)
        Как сделал - можете по ссылке посмотреть – http://seo-drojji.ru/bez-rubriki/

        • Миша 21 марта 2015 #

          Не только, могут появиться баги или сбои с работе движка (даже незаметные).

          Ссылку на описание функции я оставил в предыдущем комментарии.

  • Антон 21 марта 2015 #

    Ооох. Сложно как-то все описано:) Ладно, буду дальше искать ответ.

    • Миша 21 марта 2015 #

      Пожалуйста 🙂

      $all_categories = get_categories('hide_empty=0');
      echo '<ul>';
      foreach( $all_categories as $single_cat ){
      	echo '<li><a href="' . get_category_link($single_cat->term_id) . '">' . $single_cat->name . ' <span>(' . $single_cat->count . ')</span></a></li>';
      }
      echo '</ul>';
    • Миша 21 марта 2015 #

      Если будут вопросы по коду, спрашивайте пожалуйста — буду рад вам помочь, если будет время.

  • Антон 22 марта 2015 #

    Михаил, а этот код куда необходимо вставлять? sidebar.php? У меня просто реализовано через виджеты вывод рубрик.

  • Антон 22 марта 2015 #

    Вроде разобрался, но не знаю так или не так я сделал...Могли бы вы посмотреть на сайте? Код очень большой, чтобы его присылать:)

    Можно еще вопрос: в раздел рубрик я добавил текстовые поля (http://seo-drojji.ru/bez-rubriki/). На первой странице записи отображаются, но на второй (http://seo-drojji.ru/bez-rubriki/page/2/) текст скрывается (так необходимо) и записи "наезжают" друг на друга (так не должно быть). С чем это может быть связано?!

    • Миша 23 марта 2015 #

      Вроде всё окей. А то, что текст исчезает — возможно для вывода второй страницы у вас используется файл pages.php?

  • Антон 22 марта 2015 #

    Код для вывода рубрик сайта, который вы указали выше, не добавляется класс "current-cat" для выбранного раздела. Это можно реализовать в виджете?

    • Миша 23 марта 2015 #

      Можно.

      • Антон 23 марта 2015 #

        А какой код необходимо использовать для виджета?

    • Миша 24 марта 2015 #

      Просто добавьте условие, совпадает ли $single_cat->term_id с get_query_var('cat').

  • Эдуард 3 июня 2015 #

    Подскажите, как вывести категории без сортировки в моем порядке. я в include указал id категорий через запятую.

    • Миша 3 июня 2015 #

      Попробуйте orderby=none.

  • Эдуард 3 июня 2015 #

    пробовал. не отключается :(. проблему решил используя orderby=slug и пришлось менять имя ярлыков для упорядочения

    • Миша 4 июня 2015 #

      Та да, я тоже давно с этим мучался, то, что рубрики не имеют возможности сортировки по установленному порядку, сейчас уже и не помню, как решил задачу.

  • Александр 11 июля 2015 #

    подскажите пожалуйста, в какой именно файл стиля прописывать

    li.categories { ... } /* общий селектор */
    li.cat-item { ... }
    li.cat-item-7 { ... } /* Рубрика с ID #7 */
    li.current-cat { ... }
    li.current-cat-parent { ... }
    ul.children { ... }

    пытался в стайл в корневой папке шаблона, так не вышло..помогите плиз

    • Миша 11 июля 2015 #

      В самый последний.

  • Алексей 10 декабря 2015 #

    Здравствуйте Сегодня обновил вордпрес до последней версии В списки рубрик появились рубрики которые были исключены exclude=1,2,3,4 подскажите как быть Что нужно править чтобы исключенные рубрики не выводились в меню?

    • Миша 11 декабря 2015 #

      Здравствуйте!
      Пришлите пожалуйста полный список параметров.

  • Алексей 11 декабря 2015 #
    <nav class="widget">
    <div class="widget-header">заголовок</div>
    <ul><?php wp_list_categories('orderby=ID&show_count=0&title_li=&hide_empty=0&exclude=1,2,3,4'); ?></ul> 
    </nav>

    exclude=1,2,3,4 в этом списке не отображается только 1 рубрика Меняю местами exclude=3,1,2,4 не отображается 3 рубрика

    • Миша 11 декабря 2015 #

      Попробуйте в виде массива задать.

  • Михаил 18 декабря 2015 #

    Подскажите, возможно ли при помощи этой функции вывести списком картинки и название категорий woocommerce?
    А если нет, то какая функция дает такую возможность?
    Спасибо

    • Миша 19 декабря 2015 #

      Возможно, если указать правильное значение параметра taxonomy.

      • Михаил 19 декабря 2015 #

        Да, все верно. Список категорий у меня вывести получилось. Вот мой код:

        			<?php
        				$args = array(
        				'taxonomy'				=> 'product_cat',	// название таксономии
        				'child_of'				=> 7,				// родительская категория (Очки)
        				'use_desc_for_title'	=> 0,		// 
        				'depth'					=> 1,				// глубина вложенности потомков
        				'show_count'			=> 0,				// не показываем количество записей
        				'pad_counts'			=> 0,				// не показываем количество записей у родителей
        				'hierarchical'			=> 1,				// древовидное представление
        				'title_li'				=> '',				// список без заголовка
        				'hide_empty'			=> 0,				// показать пустые категории
        				);
        			?>
        			<ul>
        				<?php wp_list_categories( $args ); ?>
        			</ul>

        Здесь все ок. Но, мне нужно теперь к каждой категории добавить еще ее картинку. И тут у меня проблема - куда что нужно для этого добавить я понятия не имею 🙁
        Может вы подскажите?

        • Миша 20 декабря 2015 #

          Добавляйте URL картинки в описание категории — самый простой вариант.

  • Иван 19 марта 2016 #

    Миша, подскажите пожалуйста у меня название к-либо отдельной рубрики выводится в заголовке на определенной странице. Вывожу заголовок так:

    if ( is_category() ) { echo mytheme_title('',true); }

    Плюс в функциях у меня настройки на заголовок.. в общем получается так:
    ... статей на тему "Какая-то тема"
    Мне нужно вместо точек ... поставить количество записей этой категории.
    $show_count показывает ноль, не считает (см. ниже)
    Вот функция вывода заголовка..

    // Вывожу третий заголовок для рубрик
    function mytheme_title_three($display = true, $seplocation = '') {
    	global $wpdb, $wp_locale;
     
    	$title = '';
     
    	// If there's a category or tag
    	if ( is_category() || is_tag() ) {
    		$title = 'Всего'. $show_count .single_term_title( ' статей по теме «', false );
    	}
    	// If there's a taxonomy
    	if ( is_tax() ) {
    		$term = get_queried_object();
    		if ( $term ) {
    			$tax = get_taxonomy( $term->taxonomy );
    			$title = single_term_title( $tax->labels->name . $t_sep, false );
    		}
    	}
     
    	$title = apply_filters( 'mytheme_title', $title, $sep, $seplocation );
     
    	// Send it out
    	if ( $display )
    		echo $title;
    	else
    		return $title;
     
    }

    Спасибо!

  • Иван 20 марта 2016 #

    Решение нашел сам, спасибо

  • Pavel 15 марта 2020 #

    Здравствуйте, а как вывести список рубрик в виде select?

  • Сергей 3 апреля 2020 #

    Добрый день Миша.
    Подскажите пожалуйста как настроить функцию wc_get_product_category_list() на сортировку по ID (по возрастанию)?
    Всплыла маленькая неприятность, при выводе списка категории на странице товара, а за это отвечает файл single-product/meta.php и код на 34 строке:

    <?php echo wc_get_product_category_list( $product->get_id(), ', ', '<span class="posted_in">' . _n( 'Category:', 'Categories:', count( $product->get_category_ids() ), 'woocommerce' ) . ' ', '</span>' ); ?>

    выводит список категорий товара не по вложенности, ну т.е, сначала родительская, а потом субкатегория, а по алфавиту (по возрастанию). Т.е если имя субкатегории по алфавиту начнется раньше, она выведется перед родительской !!! Причем в админке Товар - Все товары, в столбце Категории выводит так же.
    Как исправить эту несправедливость? Нет я конечно могу полностью переписать meta.php, но просто интересно увидеть более деликатное решение.

    • Миша 4 апреля 2020 #

      Добрый день Сергей,

      Я бы порекомендовал вам воспользоваться для сортировки фильтр-хуком term_links-{Название таксономии}

      Тогда вы сможете спокойно отсортировать вывод как вам захочется, если вы знакомы с массивами в PHP:

      add_filter( 'term_links-product_cat', function( $links ) {
      	// делаете с массивом $links всё, что захочется
      	return $links;
      } );
      • Сергей 4 апреля 2020 #

        Благодарю, так и сделаю.

Оставить комментарий

Если вы хотите добавить код, не забудьте обернуть его в <pre lang="php"></pre>, в случае несоблюдения этого условия в 99% случаях ваш коммент будет удалён, а автор заблокирован. Печалька.