» » » wp_list_categories() — как выводить рубрики WordPress
logotip

wp_list_categories() — как выводить рубрики WordPress

Всем привет! Сегодня на seo-mayak.com мы будем разбирать функцию wp_list_categories(), которая отвечает за вывод рубрик на WordPress.

Рубрики есть на большинстве сайтах, будь то коммерческие проекты или личные блоги и поэтому данная статья будет полезна многим веб-мастерам.

Известно, что рубрики или категории, как угодно, разбивают сайт на разделы. Заголовки данных разделов выводятся в виде меню на боковой панели сайта (сайдбаре) или в шапке, а в некоторых темах рубрики можно найти даже в подвале. Как они там оказываются?

Конечно в админке есть интерфейс виджетов, с помощью которых можно вывести меню на экран. Но я спрашивал не об этом!

Как там оказываются заголовки разделов и ссылки на них? Ведь мы же их там не прописывали. Вот об этом мы и будем сегодня с Вами говорить.

rubriki-wordpress

В WordPress заложено несколько функций, которые так или иначе, касаются вывода рубрик, но самая используемая из них — это wp_list_categories().

Функция имеет массу настроек и уверен, что каждому, даже самому зеленому вебмастеру, не лишнем будет знать, как работает данная функция. Поехали!

Функция wp_list_categories()

Для начала я хочу сказать несколько слов об иерархической цепочке функций WordPress по работе с рубриками, где wp_list_categories() занимает не самое первое место.

Функция wp_list_categories() — это, так сказать, дочерняя функция, т.е. она работает на основе другой функции, а именно get_categories(), которая в свою очередь тоже имеет своего родителя — функцию get_terms().

В данной статье я не стану описывать всю анатомию взаимодействия вышеупомянутых функций, оставлю данную тему будущих постов, так что подписывайтесь на обновления блога, будет интересно!

Достаточно будет просто иметь представление о том, что процесс вывода рубрик — это сложное, многоступенчатое программное действо, которое в долю секунды осуществляется благодаря совместной работе нескольких php функций.

Функция wp_list_categories() — это конечный пункт сего действа, так сказать, продукт готовый к употреблению, поэтому работать с данной функцией довольно просто, если знать как устроена функция и какие аргумента она может принимать.

Теперь, для наглядного примера, возьмем стандартный виджет «Текст» и вставим в него функцию wp_list_categories(). Должно получится так:

Сохраняем и идем смотреть результат:

rubriki-wordpress3

Вот так функция wp_list_categories() формирует вывод рубрик по умолчанию. Даже заголовок есть!

На заметку! Если Ваша тема не поддерживают исполнение php кода в виджетах, то настоятельно советую ознакомится со этой статьей.

А теперь давайте разберемся, какие аргументы может принимать функция.

Все аргументы функции wp_list_categories()

В данном шаблоне приведены все аргументы которые может принимать функция.

Это шаблон! Не надо его никуда вставлять!

<?php 
    $args = array(
	'show_option_all'    => '',
	'orderby'            => 'name',
	'order'              => 'ASC',
    'separator'          => '<br />',
	'style'              => 'list',
	'show_count'         => 0,
	'hide_empty'         => 1,
	'use_desc_for_title' => 1,
	'child_of'           => 0,
	'feed'               => '',
	'feed_type'          => '',
	'feed_image'         => '',
	'exclude'            => '',
	'exclude_tree'       => '',
	'include'            => '',
	'hierarchical'       => 1,
	'title_li'           => __( 'Categories' ),
	'show_option_none'   => __( '' ),
	'number'             => null,
	'echo'               => 1,
	'depth'              => 0,
	'current_category'   => 0,
	'pad_counts'         => 0,
	'taxonomy'           => 'category',
	'walker'             => null
    );
    wp_list_categories( $args ); 
?>

Итак, давайте пройдемся по всем аргументам и рассмотрим их на конкретных примерах. Приступим.


show_option_all (строка)

Значением данного аргумента может быть любой текст, который будет выведен первым пунктом в общем списке рубрик в качестве ссылки на главную страницу. Например:

<ul>
<?php wp_list_categories('show_option_all=Все записи'); ?>
</ul>

rubriki-wordpress4

По умолчанию: нет.


orderby (строка)

C помощью аргумента orderby можно сортировать вывод рубрик, в зависимости от его значений. Вот список значений:

ID — Сортировка будет осуществляться по ID родительских рубрик, начиная с 1 и по возрастанию;
name — Сортировка будет осуществляться по названию родительских рубрик, согласно алфавиту;
slug — Сортировка будет осуществляться по ярлыкам родительских рубрик, согласно алфавиту;
count — Сортировка будет осуществляться по количеству записей;
term_group — Сортировка по группе.

Давайте рассмотрим пример сортировки по количеству записей в рубриках, дополнительно используя аргумент show_count:

<ul>
<?php wp_list_categories('orderby=count&show_count=1'); ?>
</ul>

rubriki-wordpress5

По умолчанию: name.


order (строка)

Данный аргумент отвечает за направление сортировки. Возможные значения:

ASC — сортировка в обычном порядке (от меньшего к большему);
DESC — сортировка в обратном порядке (от большего к меньшему);

Здесь есть один момент, который я хотел бы отметить. Рубрики без подрубрик окажутся в вверху списка не зависимо от количества записей:

<ul>
<?php wp_list_categories('order=DESC&orderby=count&show_count=1');?>
</ul>

rubriki-wordpress7

По умолчанию: ASC.


separator (строка)

С помощью этого аргумента можно задавать разделитель между ссылками. Действует только если значение аргумента: 'style' установлено 'none'.

<ul>
<?php wp_list_categories('separator=<br />&style=none&orderby=count&show_count=1');?>
</ul>

По умолчанию: <br />.


style (строка)

С помощью этого аргумента можно задавать html структуру для меню рубрик.

list — Структура html для рубрик будет формироваться с использованием тегов <ul> и <li>;
none — Список рубрик будет выведен в виде обычных ссылок. Если не изменено значение аргумента: 'separator', то перенос строк будет осуществляться с помощью тега <br/> (вложенность подрубрик будет соблюдена).

<ul>
<?php wp_list_categories('style=none&orderby=count&show_count=1');?>
</ul>

rubriki-wordpress8

По умолчанию: list.


show_count (логическое/число)

Определяет показывать или не показывать количество записей в рубриках.

1 — Будет выводится количество записей в каждой рубрике;
0 — Количество записей выводится не будет.

По умолчанию: 0.


hide_empty (логическое/число)

Определяет включать или не включать в меню пустые рубрики.

1 — Пустые рубрики будут скрыты;
0 — Пустые рубрики будут включены в список.

<ul>
<?php wp_list_categories('hide_empty=0&show_count=1');?>
</ul>

rubriki-wordpress-9

По умолчанию: 1.


use_desc_for_title (логическое/число)

Для каждой рубрики можно сделать описание (description). Если такое описание существует, то с помощью данного аргумента его можно встроить в html код.

1 — Описание (если оно есть) будет встроено в html код;
0 — Описание встраиваться не будет.

<ul>
<?php wp_list_categories('use_desc_for_title=1&show_count=1');?>
</ul>

rubriki-wordpress-10

По умолчанию: 1.


child_of (число)

В качестве значения для аргумента child_of служит ID родительской рубрики, из которой надо вывести все дочерние категории. Допускается указывать только один ID.

<ul>
<?php wp_list_categories('child_of=10&show_count=1');?>
</ul>

rubriki-wordpress-11

По умолчанию: 0.


feed (строка)

Добавляет к названию каждой рубрики ссылку на rss-канал. В качестве значения задается текст, который и будет отображаться.

<ul>
<?php wp_list_categories('feed=RSS&show_count=1');?>
</ul>

rubriki-wordpress-12

Не знаю использовал ли кто-нибудь данный аргумент, по мне, так он лишний.

По умолчанию: нет.


feed_type (строка)

Указывает на тип фида.

По умолчанию: rss-2.


feed_image (строка)

В качестве значения этого аргумента задается ссылка на изображение, которое будет выводится рядом с названием каждой рубрики, при этом аргумент feed перестает действовать.

<ul>
<?php wp_list_categories('feed_image=/wp-content/themes/wp-themes-blogger/images/feed_32x32.png&feed=RSS&show_count=1');?>
</ul>

rubriki-wordpress-13

По умолчанию: нет.


exclude (массив/строка)

Аргумент exclude позволяет исключать одну или несколько рубрик из списка по их ID, при этом действие аргумента child_of (если он указан) будет отменено.

Если исключить родительские рубрики, например с ID 10 и 14:

<ul>
<?php wp_list_categories('exclude=10,14&show_count=1');?>
</ul>

В этом случаи будут исключены все дочерние рубрики, относящиеся к родителям с вышеупомянутыми ID.

Чтобы этого не произошло, в значении аргумента hierarchical надо установить 0, при этом дерево рубрик будет отключено.

Если hierarchical равен 0, то для исключения всей ветки используется аргумент exclude_tree.

По умолчанию: нет.


exclude_tree (массив/строка)

C помощью данного аргумента можно исключить из списка дерево одной или нескольких рубрик. В значении указывается ID одной или нескольких рубрик через запятую.

<ul>
<?php wp_list_categories('exclude_tree=10,14&show_count=1');?>
</ul>

Если значение аргумента hierarchical равно 0, то используется аргумент exclude, вместо exclude_tree.

По умолчанию: нет.


include (строка)

Аргумент include позволяет вывести в меню только указанные рубрики. ID рубрик перечисляется через запятую.

<ul>
<?php wp_list_categories('include=10,14&show_count=1');?>
</ul>

Рубрики выводятся в точно соответствии с ID , т.е. если указать ID родительских рубрик, дочерние рубрики выведены не будут.

По умолчанию: нет.


hierarchical (логическое)

Позволяет выводить дочерние категории в виде вложенного списка (дерева).

1 — выведет древовидный список рубрик.
0 — выведет рубрики сплошным типом, при этом родительские рубрики будут исключены.

<ul>
<?php wp_list_categories('hierarchical=0&show_count=1');?>
</ul>

rubriki-wordpress-14

По умолчанию: 1.


title_li (строка)

Устанавливает заголовок для списка рубрик. В качестве значения указывается текст.

<ul>
<?php wp_list_categories('title_li=Все разделы&show_count=1');?>
</ul>

rubriki-wordpress-15

По умолчанию: Рубрики.


show_option_none (строка)

В том случаи, если по запросу не будет найдено ни одной рубрики, будет выведен указанный тест.

<ul>
<?php wp_list_categories('include=99,100&show_option_none=Рубрик не найдено');?>
</ul>

rubriki-wordpress-16

По умолчанию: Нет рубрик.


number (число)

В данной аргументе можно установить лимит на отображение рубрик. Например:

<ul>
<?php wp_list_categories('number=5&show_count=1');?>
</ul>

Будет выведено 5 рубрик.

По умолчанию: нет.


echo (логическое/число)

Применения данного аргумента позволяет возвращать html код списка рубрик или выводить его на экран.

0 — Возвращать данные для дальнейшей обработки;
1 — Выводить список рубрик на экран.

По умолчанию: 1.


depth (число)

Определяет глубину вложенности рубрик.

0 — Будут выведены все уровни рубрик без ограничений;
-1 — Будут выведены все уровни, но без дерева (сплошным типом). Отменяет аргумент hierarchical;
1 — Будут выведены рубрики только первого уровня. Все дочерние категории исключаются.
n — Произвольное числовое значение глубины вложенности рубрик для вывода на экран.

По умолчанию: 0.


current_category (число/массив)

Интересный аргумент, позволяющий добавлять css класс current-cat к определенной рубрике. В обычном режиме такой класс добавляется к текущей рубрики и в основном применяется для подсветки. Также данный класс используется в php скриптах для удаления циклических ссылок.

В качестве значения указывается ID рубрики или нескольких рубрик через запятую.

<ul>
<?php wp_list_categories('current_category=8,51&show_count=1'); ?>
</ul>

rubriki-wordpress-17

По умолчанию: текущая рубрика.


pad_counts (логическое)

Суммирует количество записей в дочерних рубриках и выводит результат в родительскую рубрику.

1 — выводит количество записей в родительскую рубрику;
0 — количество записей не выводится.

<ul>
<?php wp_list_categories('pad_counts=0&show_count=1'); ?>
</ul>

rubriki-wordpress-18

Значение 1 устанавливается автоматически при использовании show_count=1 и hierarchical=1.

По умолчанию: 0.


hide_title_if_empty (логическое)

Определяет выводить или не выводить заголовок списка рубрик если нет ни одной записи.

0 — выводить заголовок;
1 — не выводить заголовок.

По умолчанию: 0.


taxonomy (строка)

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

<?php
$args = array(
  'taxonomy'     => 'product', // Название произвольной таксономии
  'orderby'      => 'name',  // Сортируем по названия, согласно алфавиту 
  'show_count'   => 1,       // Выводим количество записей
  'exclude'   => 10,22,       // Исключаем рубрики с ID 10 и 14
  'hierarchical' => 1,       // Включаем древовидный список
  'title_li'     => '',    // Убираем заголовок списка
  'use_desc_for_title' => 1   // Выводим описание рубрик
);
?>
// Код для вставки в виджет или другое место на сайте
<ul>
<?php wp_list_categories( $args ); ?>
</ul>

По умолчанию: category.


walker (объект)

Аргумент принимает расширение объекта (класса), который предназначен для создание списка категорий. Передаваемый аргументу объект — это расширение для класса Walker_Category или Walker.

По умолчанию: Walker_Category.

Функция возвращает: HTML-контент, только если аргумент «echo» равен 0.

Встроенные CSS классы для тегов li и ul

li.categories { ... }  /* общий селектор */
li.cat-item { ... }    /* для всех рубрик в отдельности */
ul.children { ... }  /* селектор для родительских рубрик */
li.cat-item-7 { ... }  /* селектор для рубрики с ID 7 */
li.current-cat { ... }  /* селектор для текущей рубрики */
li.current-cat-parent { ... } /* селектор для родительской рубрики текущей подрубрики */

Хуки функции

В работу функции можно вмешаться с помощью одноименного хука-фильтра wp_list_categories:

function filter_wp_list_categories(){
	/* Какой-то сценарий */
}
add_filter('wp_list_categories', 'filter_wp_list_categories');

Живой пример использования хука можно посмотреть в статье Сквозные ссылки.

Таблица изменений

Версия Дата Описание
2.1.0 22.01.2007 Внедрение
2.3.0 24.09.2007 Введен аргумент echo.
2.5.0 29.03.2008 Введен аргумент depth.
2.6.0 15.07.2008 Введен аргумент current_category.
2.7.1 10.02.2009 Введен аргумент exclude_tree.
2.9.0 19.12.2009 Введен аргумент pad_counts.
3.0.0 17.06.2010 Введен аргумент taxonomy.
3.4.0 13.06.2012 Удален аргумент show_last_update.
4.4.0 08.12.2015 Введены аргументы hide_title_if_empty и separator. Изменен аргумент current_category (теперь он стал необязательным).

Файл: wp-includes/category-template.php (Развернуть)

До встречи!

С уважением, Виталий Кириллов

Статьи по теме:

Title, description, keywords и h1 для категорий (рубрик) WordPress
Редактор для категорий (рубрик), меток и произвольных таксономий
Категории WordPress — термы и таксономии
Шаблоны для категорий — как сделать каталог из рубрики

Комментарии: 33

  1. Татьяна:

    Здравствуйте, Виталий!
    Замечательно, что Вы затронули эту тему. Я вот давно интересуюсь, как сделать так, чтобы при нажатии на родительскую рубрику, не выводились ВСЕ записи дочерних рубрик? Можно ли, скажем, выводить записи именно этой родительской рубрики? Есть такой параметр?
    Спасибо!

    Ответить
    • Виталий Кириллов:

      Татьяна, параметры функции wp_list_categories() могут влиять на отображение меню рубрик и не распространяют свое действие на сами записи. Вы можете создать произвольное меню (внешний вид -> меню), где можно с легкостью реализовать задуманную Вами расстановку.

      Ответить
      • Татьяна:

        Спасибо за ответ! Но самой мне это не реализовать… Буду надеяться, что Вы когда-нибудь напишите подробную статью, как это сделать) Я думаю, что многие заинтересуются!

        Ответить
        • Виталий Кириллов:

          Хорошо Татьяна, буду иметь в виду.

          Ответить
  2. Наталья:

    Виталий, спасибо за подробную статью! Все очень понятно и доходчиво) Какую же Вы работу проделали объемную!

    Ответить
    • Виталий Кириллов:

      Здравствуйте Наталья! Рад снова Вас видеть на блоге! Я по-другому писать не умею, краткость не мой талант)

      Ответить
  3. Bogutskiy:

    Отличная статья. Сделал все как описано. Все получилось. Спасибо.

    Ответить
  4. Юрий:

    Вечер добрый! Может подскажите код CSS для создания стиля выводимых категорий , с появлением дочерних элементов как в меню. ( первичная попытка, показывает , что это возможно)

    Ответить
  5. Владимир:

    Виталий приветствую, помоги если можешь, как на сайте WP защитить рубрику паролем, короче нужно к одному разделу сделать ограниченный доступ, как это реализовать, заранее благодарю.

    Ответить
    • Виталий Кириллов:

      Владимир, на WP есть возможность защищать паролем только запись или страницу! Как это провернуть с рубрикой я не знаю.

      Ответить
      • Татьяна:

        Интересно… Виталий, а у Вас нет случайно статьи на эту тему?

        Ответить
        • Виталий Кириллов:

          Татьяна, на какую тему?

          Ответить
  6. Татьяна:

    На тему «Как защитить паролем запись или страницу». Первый раз услышала о такой возможности от WordPress…

    Ответить
    • Виталий Кириллов:

      Нет, такой статьи нет. Возможно стоит написать. Если честно, думал, что все знают, как защищать записи паролем.

      Ответить
  7. Татьяна:

    Тогда буду ждать такую статью. А вот еще Виталий, дайте, пожалуйста, ссылочку на статью, как вывести по клику на Рубрику список Дочерних рубрик в виде списка.Такая статья вроде у Вас была.

    Ответить
    • Виталий Кириллов:

      Вы имеете в виду меню-аккордеон? Нет какой статьи у меня пока нет.

      Ответить
  8. Татьяна:

    Нет, не аккордеон. Вот эта статья, к которой комментарии, с функцией wp_list_categories() в принципе подходит, только хотелось бы что список дочерних рубрик выводились не в виджете, а в записи по клику на родительскую. Наверное, я непонятно объясняю…

    Ответить
    • Виталий Кириллов:

      Т.е. родительская рубрика располагается в меню сайдбара и по клику на нее должны отобразиться анонсы только дочерних рубрик. Я правильно понял?

      Ответить
  9. Татьяна:

    Да, это как раз то, что я имела в виду. Просто на данный момент в WP реализовано,что по клику на нее выдаются либо все записи (и дочерних и родительских) в куче…

    Ответить
    • Виталий Кириллов:

      Татьяна, так я описывал данные настройки в этой статье.

      Ответить
  10. Татьяна:

    Чтобы получилось нечто похожее на карту рубрики (аналогично тому, как это реализует плагин в карте сайте). Можно так сделать?

    Ответить
    • Виталий Кириллов:

      Вы меня опять запутали. Вы хотите чтобы на странице родительской рубрики отображались только заголовки дочерних рубрик, без текста и картинок?

      Ответить
      • Татьяна:

        Да. Простите, что Вас запутала…

        Ответить
  11. Татьяна:

    Вот я эту статью как раз и ищу. Спасибо большое, Виталий! Буду разбираться!

    Ответить
  12. Татьяна:

    Да, именно так. Можно было бы добавить еще описание этой рубрики.

    Ответить
  13. Steve:

    Добрый день. Спасибо за полезную статью. Подскажите, пожалуйста, а как сделать так, чтобы в меню отображались только категории с записями, а пустые не отображались, пока в них не появятся записи. Знаю, что менюшки можно настраивать, но можно ли как-то сделать так, чтобы оно автоматом подтягивало менюшки с записями, а пустые прятало (в wp-admin/nav-menus.php я все заранее настрою). Нужно это для того, что у меня 150+категорий и настроено меню, НО далеко не по всем подкатегориям и категориям есть записи.

    Спасибо!

    Ответить
  14. Виталий:

    Спасибо тёзка очень помог, очень нужная и полезная статья

    Ответить
  15. Nazim:

    Огромное спасибо за разбор данной темы. Очень полезно, сохранил страницу в закладках. У меня вопрос и прошу помощи. Это касается вывод родительских и дочерних рубрик. По умолчанию, если выводить рубрики в виджете, то выводятся все главные рубрики и все дочерние рубрики. Я думаю так не верно. Можно сделать так, что бы я вошел в рубрику ФУТБОЛ и там выводились бы дочерние рубрики от родительской рубрики ФУТБОЛ. А если я перейду ы главную рубрику ХОККЕЙ, то соответственно там бы выводились дочерние рубрики рубрики ХОККЕЙ. А сечас ведь как? Войду в ФУТБОЛ, и там выводятся все родительские и все дочерние рубрики. То же самое, если я войду в другую рубрику. Буду благодарен, если поможете с этим вопросом.

    Ответить
  16. Dzmitry Roshchyn:

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

    С ув. Дмитрий

    Ответить
    • Виталий Кириллов:

      У меня есть функция, вот она:

      function mayak_cats_images(){
      $ags = array(
      'taxonomy'=>'category',
      'parent' => get_query_var('cat'),
      'meta_query' => array(array('key' => 'id-cat-images',)),
      );
      $terms = get_terms($ags);
       $count = count($terms);
       if($count > 0){
      	 echo '
      '; } }

      Она правда подрубрики сразу с миниатюрами выводит, тут подробней, не можно ее немного изменить, убрать миниатюры, останутся только ссылки.
      Правда все это будет выводится в теле страницы, но и тут надо немного изменить функцию, чтобы вывести данные в нужном месте.

      Ответить
      • Dzmitry Roshchyn:

        Хотелось так (частично решено): в хлебных крошках выводится название главной рубрики (как ссылка), это есть. А вот подрубрику в виде ссылки хотелось поставить там, где обычно дата, время и автор. Как бы, получается нужно разделить рубрику и подрубрику по разным местам. Неужели в «Вордпресс» нет функции вывода только подрубрики, только в паре?

        Ответить
        • Виталий Кириллов:

          Нет функционала, потому что есть плагины.

          Ответить

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

Внимание комментатор! Прежде чем вставить: HTML, JavaScript или PHP код в свой комментарий, преобразуй его в html сущность!

Subscribe without commenting

» Подписаться на комментарии по RSS