Всем привет! Сегодня на seo-mayak.com мы будем разбирать функцию wp_list_categories(), которая отвечает за вывод рубрик на 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(). Должно получится так:
Сохраняем и идем смотреть результат:
Вот так функция wp_list_categories() формирует вывод рубрик по умолчанию. Даже заголовок есть!
А теперь давайте разберемся, какие аргументы может принимать функция.
Все аргументы функции 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 ); ?>
Итак, давайте пройдемся по всем аргументам и рассмотрим их на конкретных примерах. Приступим.
Значением данного аргумента может быть любой текст, который будет выведен первым пунктом в общем списке рубрик в качестве ссылки на главную страницу. Например:
<ul> <?php wp_list_categories('show_option_all=Все записи'); ?> </ul>
По умолчанию: нет.
C помощью аргумента orderby можно сортировать вывод рубрик, в зависимости от его значений. Вот список значений:
ID — Сортировка будет осуществляться по ID родительских рубрик, начиная с 1 и по возрастанию;
name — Сортировка будет осуществляться по названию родительских рубрик, согласно алфавиту;
slug — Сортировка будет осуществляться по ярлыкам родительских рубрик, согласно алфавиту;
count — Сортировка будет осуществляться по количеству записей;
term_group — Сортировка по группе.
Давайте рассмотрим пример сортировки по количеству записей в рубриках, дополнительно используя аргумент show_count:
<ul> <?php wp_list_categories('orderby=count&show_count=1'); ?> </ul>
По умолчанию: name.
Данный аргумент отвечает за направление сортировки. Возможные значения:
ASC — сортировка в обычном порядке (от меньшего к большему);
DESC — сортировка в обратном порядке (от большего к меньшему);
Здесь есть один момент, который я хотел бы отметить. Рубрики без подрубрик окажутся в вверху списка не зависимо от количества записей:
<ul> <?php wp_list_categories('order=DESC&orderby=count&show_count=1');?> </ul>
По умолчанию: ASC.
С помощью этого аргумента можно задавать разделитель между ссылками. Действует только если значение аргумента: 'style' установлено 'none'.
<ul> <?php wp_list_categories('separator=<br />&style=none&orderby=count&show_count=1');?> </ul>
По умолчанию: <br />.
С помощью этого аргумента можно задавать html структуру для меню рубрик.
list — Структура html для рубрик будет формироваться с использованием тегов <ul> и <li>;
none — Список рубрик будет выведен в виде обычных ссылок. Если не изменено значение аргумента: 'separator', то перенос строк будет осуществляться с помощью тега <br/> (вложенность подрубрик будет соблюдена).
<ul> <?php wp_list_categories('style=none&orderby=count&show_count=1');?> </ul>
По умолчанию: list.
Определяет показывать или не показывать количество записей в рубриках.
1 — Будет выводится количество записей в каждой рубрике;
0 — Количество записей выводится не будет.
По умолчанию: 0.
Определяет включать или не включать в меню пустые рубрики.
1 — Пустые рубрики будут скрыты;
0 — Пустые рубрики будут включены в список.
<ul> <?php wp_list_categories('hide_empty=0&show_count=1');?> </ul>
По умолчанию: 1.
use_desc_for_title (логическое/число)
Для каждой рубрики можно сделать описание (description). Если такое описание существует, то с помощью данного аргумента его можно встроить в html код.
1 — Описание (если оно есть) будет встроено в html код;
0 — Описание встраиваться не будет.
<ul> <?php wp_list_categories('use_desc_for_title=1&show_count=1');?> </ul>
По умолчанию: 1.
В качестве значения для аргумента child_of служит ID родительской рубрики, из которой надо вывести все дочерние категории. Допускается указывать только один ID.
<ul> <?php wp_list_categories('child_of=10&show_count=1');?> </ul>
По умолчанию: 0.
Добавляет к названию каждой рубрики ссылку на rss-канал. В качестве значения задается текст, который и будет отображаться.
<ul> <?php wp_list_categories('feed=RSS&show_count=1');?> </ul>
Не знаю использовал ли кто-нибудь данный аргумент, по мне, так он лишний.
По умолчанию: нет.
Указывает на тип фида.
По умолчанию: rss-2.
В качестве значения этого аргумента задается ссылка на изображение, которое будет выводится рядом с названием каждой рубрики, при этом аргумент feed перестает действовать.
<ul> <?php wp_list_categories('feed_image=/wp-content/themes/wp-themes-blogger/images/feed_32x32.png&feed=RSS&show_count=1');?> </ul>
По умолчанию: нет.
Аргумент 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.
По умолчанию: нет.
C помощью данного аргумента можно исключить из списка дерево одной или нескольких рубрик. В значении указывается ID одной или нескольких рубрик через запятую.
<ul> <?php wp_list_categories('exclude_tree=10,14&show_count=1');?> </ul>
Если значение аргумента hierarchical равно 0, то используется аргумент exclude, вместо exclude_tree.
По умолчанию: нет.
Аргумент include позволяет вывести в меню только указанные рубрики. ID рубрик перечисляется через запятую.
<ul> <?php wp_list_categories('include=10,14&show_count=1');?> </ul>
Рубрики выводятся в точно соответствии с ID , т.е. если указать ID родительских рубрик, дочерние рубрики выведены не будут.
По умолчанию: нет.
Позволяет выводить дочерние категории в виде вложенного списка (дерева).
1 — выведет древовидный список рубрик.
0 — выведет рубрики сплошным типом, при этом родительские рубрики будут исключены.
<ul> <?php wp_list_categories('hierarchical=0&show_count=1');?> </ul>
По умолчанию: 1.
Устанавливает заголовок для списка рубрик. В качестве значения указывается текст.
<ul> <?php wp_list_categories('title_li=Все разделы&show_count=1');?> </ul>
По умолчанию: Рубрики.
В том случаи, если по запросу не будет найдено ни одной рубрики, будет выведен указанный тест.
<ul> <?php wp_list_categories('include=99,100&show_option_none=Рубрик не найдено');?> </ul>
По умолчанию: Нет рубрик.
В данной аргументе можно установить лимит на отображение рубрик. Например:
<ul> <?php wp_list_categories('number=5&show_count=1');?> </ul>
Будет выведено 5 рубрик.
По умолчанию: нет.
Применения данного аргумента позволяет возвращать html код списка рубрик или выводить его на экран.
0 — Возвращать данные для дальнейшей обработки;
1 — Выводить список рубрик на экран.
По умолчанию: 1.
Определяет глубину вложенности рубрик.
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>
По умолчанию: текущая рубрика.
Суммирует количество записей в дочерних рубриках и выводит результат в родительскую рубрику.
1 — выводит количество записей в родительскую рубрику;
0 — количество записей не выводится.
<ul> <?php wp_list_categories('pad_counts=0&show_count=1'); ?> </ul>
Значение 1 устанавливается автоматически при использовании show_count=1 и hierarchical=1.
По умолчанию: 0.
hide_title_if_empty (логическое)
Определяет выводить или не выводить заголовок списка рубрик если нет ни одной записи.
0 — выводить заголовок;
1 — не выводить заголовок.
По умолчанию: 0.
В качестве значение указывается название таксономии, рубрики которой будут выведены на экран. Незаменимый аргумент для вывода таксономий произвольных типов записей.
<?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_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 — термы и таксономии
Шаблоны для категорий — как сделать каталог из рубрики
Здравствуйте, Виталий!
Замечательно, что Вы затронули эту тему. Я вот давно интересуюсь, как сделать так, чтобы при нажатии на родительскую рубрику, не выводились ВСЕ записи дочерних рубрик? Можно ли, скажем, выводить записи именно этой родительской рубрики? Есть такой параметр?
Спасибо!
Татьяна, параметры функции wp_list_categories() могут влиять на отображение меню рубрик и не распространяют свое действие на сами записи. Вы можете создать произвольное меню (внешний вид -> меню), где можно с легкостью реализовать задуманную Вами расстановку.
Спасибо за ответ! Но самой мне это не реализовать… Буду надеяться, что Вы когда-нибудь напишите подробную статью, как это сделать) Я думаю, что многие заинтересуются!
Хорошо Татьяна, буду иметь в виду.
Виталий, спасибо за подробную статью! Все очень понятно и доходчиво) Какую же Вы работу проделали объемную!
Здравствуйте Наталья! Рад снова Вас видеть на блоге! Я по-другому писать не умею, краткость не мой талант)
Отличная статья. Сделал все как описано. Все получилось. Спасибо.
Вечер добрый! Может подскажите код CSS для создания стиля выводимых категорий , с появлением дочерних элементов как в меню. ( первичная попытка, показывает , что это возможно)
Виталий приветствую, помоги если можешь, как на сайте WP защитить рубрику паролем, короче нужно к одному разделу сделать ограниченный доступ, как это реализовать, заранее благодарю.
Владимир, на WP есть возможность защищать паролем только запись или страницу! Как это провернуть с рубрикой я не знаю.
Интересно… Виталий, а у Вас нет случайно статьи на эту тему?
Татьяна, на какую тему?
На тему «Как защитить паролем запись или страницу». Первый раз услышала о такой возможности от WordPress…
Нет, такой статьи нет. Возможно стоит написать. Если честно, думал, что все знают, как защищать записи паролем.
Тогда буду ждать такую статью. А вот еще Виталий, дайте, пожалуйста, ссылочку на статью, как вывести по клику на Рубрику список Дочерних рубрик в виде списка.Такая статья вроде у Вас была.
Вы имеете в виду меню-аккордеон? Нет какой статьи у меня пока нет.
Нет, не аккордеон. Вот эта статья, к которой комментарии, с функцией wp_list_categories() в принципе подходит, только хотелось бы что список дочерних рубрик выводились не в виджете, а в записи по клику на родительскую. Наверное, я непонятно объясняю…
Т.е. родительская рубрика располагается в меню сайдбара и по клику на нее должны отобразиться анонсы только дочерних рубрик. Я правильно понял?
Да, это как раз то, что я имела в виду. Просто на данный момент в WP реализовано,что по клику на нее выдаются либо все записи (и дочерних и родительских) в куче…
Татьяна, так я описывал данные настройки в этой статье.
Чтобы получилось нечто похожее на карту рубрики (аналогично тому, как это реализует плагин в карте сайте). Можно так сделать?
Вы меня опять запутали. Вы хотите чтобы на странице родительской рубрики отображались только заголовки дочерних рубрик, без текста и картинок?
Да. Простите, что Вас запутала…
Вот я эту статью как раз и ищу. Спасибо большое, Виталий! Буду разбираться!
Да, именно так. Можно было бы добавить еще описание этой рубрики.
Добрый день. Спасибо за полезную статью. Подскажите, пожалуйста, а как сделать так, чтобы в меню отображались только категории с записями, а пустые не отображались, пока в них не появятся записи. Знаю, что менюшки можно настраивать, но можно ли как-то сделать так, чтобы оно автоматом подтягивало менюшки с записями, а пустые прятало (в wp-admin/nav-menus.php я все заранее настрою). Нужно это для того, что у меня 150+категорий и настроено меню, НО далеко не по всем подкатегориям и категориям есть записи.
Спасибо!
Спасибо тёзка очень помог, очень нужная и полезная статья
Огромное спасибо за разбор данной темы. Очень полезно, сохранил страницу в закладках. У меня вопрос и прошу помощи. Это касается вывод родительских и дочерних рубрик. По умолчанию, если выводить рубрики в виджете, то выводятся все главные рубрики и все дочерние рубрики. Я думаю так не верно. Можно сделать так, что бы я вошел в рубрику ФУТБОЛ и там выводились бы дочерние рубрики от родительской рубрики ФУТБОЛ. А если я перейду ы главную рубрику ХОККЕЙ, то соответственно там бы выводились дочерние рубрики рубрики ХОККЕЙ. А сечас ведь как? Войду в ФУТБОЛ, и там выводятся все родительские и все дочерние рубрики. То же самое, если я войду в другую рубрику. Буду благодарен, если поможете с этим вопросом.
Вам наверное сюда — https://seo-mayak.com/kodex/get_terms
У функции get_terms() более тонкая настройка.
Виталий, приветствую! Вопрос! В записях (а также в тизерах гл. страницы) выводится в виде ссылок, как рубрика, так и подрубрика, в которую они добавлены (классика болшинства шаблонов «ВордПресс»). Но как вывести только подрубрику, то есть убрать родительский элемент, оставив дочерний?
С ув. Дмитрий
У меня есть функция, вот она:
Она правда подрубрики сразу с миниатюрами выводит, тут подробней, не можно ее немного изменить, убрать миниатюры, останутся только ссылки.
Правда все это будет выводится в теле страницы, но и тут надо немного изменить функцию, чтобы вывести данные в нужном месте.
Хотелось так (частично решено): в хлебных крошках выводится название главной рубрики (как ссылка), это есть. А вот подрубрику в виде ссылки хотелось поставить там, где обычно дата, время и автор. Как бы, получается нужно разделить рубрику и подрубрику по разным местам. Неужели в «Вордпресс» нет функции вывода только подрубрики, только в паре?
Нет функционала, потому что есть плагины.