get_categories() — функция для вывода рубрик

Удобная функция для вывода категорий в WordPress. Очень широко используется в плагинах и темах. Хотя лично я вместо неё предпочитаю get_terms().

get_categories( $args = '' )
$args
(массив|строка) параметры функции:

taxonomy
(строка) таксономия, по умолчанию — category (т.е. рубрики).

Все остальные параметры переменной $args полностью идентичны параметрам массива $args функции get_terms().

Возвращаемые значения функции

Функция возвращает массив, состоящий из объектов категорий (или других таксономий), удовлетворяющих заданным критериям. Каждый из объектов содержит информацию о категории, например ID, название, ярлык, описание и т.д. Содержимое объекта я уже рассматривал тут.

Пример 1. Выводим названия всех категорий через запятую

Напоминаю, что подробное описание всех параметров есть в документации функции get_terms().

$all_categories = get_categories('fields=names');
echo implode(', ', $all_categories); // функция implode() преобразует массив в строку

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

Для получения ссылки на страницу архива рубрики можно использовать функции get_category_link() или get_term_link().

$all_categories = get_categories('hide_empty=0');
$category_link_array = array();
foreach( $all_categories as $single_cat ){
	$category_link_array[] = '<a href="' . get_category_link($single_cat->term_id) . '">' . $single_cat->name . '</a>';
}
echo implode(',', $category_link_array);

Пример 3. Создание выпадающего списка рубрик с автоматическим переходом на них при выборе

На момент написания этой статьи подобная навигация по рубрикам стоит у меня на блоге. На самом деле делается это совсем не трудно. Буквально одна строчка JavaScript — и всё готово.

$all_categories = get_categories();
if( $all_categories ){ // выводить пустой список в случае, если рубрик нет, ни к чему
	echo '<select onchange="document.location.href=this.options[this.selectedIndex].value;"><option value="">Выберите категорию</option>';
	foreach( $all_categories as $single_cat ){
		echo '<option value="' . get_category_link($single_cat->term_id) . '">' . $single_cat->name . '</option>';
	}
	echo '</select>';
}

Фильтр get_categories_taxonomy

Начиная с версии WordPress 2.7.0 параметр таксономии taxonomy можно пропустить через фильтр.

function change_taxonomy_for_get_categories($taxonomy, $args){
	// $taxonomy - таксономия по умолчанию, т е либо category, либо то, что было передано в параметрах функции
	// $args - все параметры функции
	return 'post_tag'; // в качестве таксономии задали метки поста 
}
add_filter('get_categories_taxonomy', 'change_taxonomy_for_get_categories', 20, 2);

Если просто вставить этот фильтр в functions.php вашей темы, то функция get_categories() уже будет работать неправильно — вместо рубрик возвращать метки.

Используйте этот фильтр при необходимости и с осторожностью.

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

  • Dennis25 апреля 2015 в 21:04 #

    Подскажите пожалуйста, есть шаблон category.php.
    Есть рубрики. В некоторых есть вложенные. Как выводить на странице site.ru/rubrika1 - вложенные рубрики и записи в них?
    Не универсальное решение - сделать индивидуальный шаблон и по ID вывести...
    Хотелось бы универсальное.

  • Dennis25 апреля 2015 в 23:04 #

    Сформулирую иначе.
    Все публикации на сайте входят в рубрику Статьи. В рубрике Статьи много вложенных рубрик.
    Как по адресу site.ru/vse-stati вывести все в таком виде

    Название подрубрики (кликабельное)
    -запись вложенной рубрики.
    -запись вложенной рубрики.

    Название подрубрики (кликабельное)
    -запись вложенной рубрики.
    -запись вложенной рубрики.

    • Миша26 апреля 2015 в 07:04 #

      Как раз таки при помощи get_categories() (обязательно используем параметр parent или child_of), а внутри цикла можно будет запустить ещё WP_Query.

  • Далв1 сентября 2015 в 08:09 #

    В целом все верно, но так было бы получше:

        $category_link = sprintf( '<a href="%1$s" alt="%2$s">%3$s</a>'
            esc_url( get_category_link( $category->term_id ) ),
            esc_attr( sprintf( __( 'View all posts in %s', 'textdomain' ), $category->name ) ),
            esc_html( $category->name )
        );

    Взято из каментов к оф докам

  • Александр6 ноября 2015 в 11:11 #

    у меня в шаблоне страница карат сайта не выводит подрубрики.
    у меня в атрибутах страницы выбран шаблон map.php
    вот код map.php:

    пожалуйста, скажите как добавить сюда вывод подкатегорий в функцию get_categories

    • Миша7 ноября 2015 в 05:11 #

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

      • Александр7 ноября 2015 в 11:11 #
        <?php  /* Template Name: map.php */
        get_header(); 
        ?>
        <div class="container">
            <div class="row" id="page">                          
                <div class="span12">                
                     <div class="span8" id="maincolumn">     
                         <div class="content">    
                              <div class="row"> 
                                   <?php the_breadcrumb() ?> 
         
                                   <h1 class="<?php if (get_theme_mod('show_line') == '1') { ?>category-line<?php } elseif (get_theme_mod('show_line') == '2') { ?>category-gray-line<?php } else { ?><?php } ?>">Карта портала</h1>
                                   <?php if (function_exists('ddsg_create_sitemap')) { 
                                          echo ddsg_create_sitemap();
                                     } else {
                                          echo '<div id="site-map">';
                     $cats = get_categories('parent=0&orderby=name&hierarchical=0');
                                            foreach ($cats as $category) {
                                                print '<div class="category category-map"><a href="'.get_category_link($category->cat_ID).'">'.$category->name.'</a></div>';
                                                print '<ul>';
                                                query_posts(array('cat' => $category->cat_ID,'showposts'=>1000));
                                                while (have_posts()) {  the_post();
                                              $showed_ids[] = get_the_ID();
                                    ?>
                                              <li><a href="<?php the_permalink() ?>" rel="bookmark" title="<?php the_title(); ?>"><?php the_title() ?></a></li>
                                    <?php } 
                                            echo '</ul>';
                                         }        
                                            echo '</div>';
                                         }
                                    ?>                         
                              </div><!--End row--> 
                         </div><!-- End content--> 
                     </div><!-- End span8--> 
         
                     <div class="span4" id="sidebar"> 
                          <?php get_sidebar(); ?>
                     </div>  
                </div><!-- End span12-->  
           </div><!-- End row-->      
        </div><!-- End container -->
         
        <?php get_footer(); ?>
  • Александр7 ноября 2015 в 11:11 #

    очень жду от вас помощи. спасибо

    • Миша8 ноября 2015 в 08:11 #

      Измените строчку:

      $cats = get_categories('parent=0&orderby=name&hierarchical=0');

      на:

      $cats = get_categories('orderby=name&hierarchical=0');

      .

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

phpjsHTMLCSSSQLПросто код
  Для того, чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или авторизуйтесь на сайте.
Получайте новости блога по email или следите за мной в социальных сетях.
  • Миша: Да, точно)

  • Владимир: и на третьей строке не хватает скобки ) закрывающей if :)

  • Миша: Добрый вечер! Рекомендую получить ID пользователя через функцию get_current_user_id().

  • Дмитрий: Миша, подскажите пожалуйста, я использую такой редирект, но он не срабатывает: add_action( 'template_redirect', funct...

  • Миша: Ну как не определена - это аргумент функции. Или я просто вас не до конца понимаю.