WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

get_categories() WP 2.1.0

Возвращает массив объектов содержащих информацию о категориях.

Параметры передаваемые этой функции очень похожи на параметры передаваемые функции wp_list_categories() и могут быть переданы как в виде массива, так и в виде строки запроса: type=post&order=DESC.

Является основой для: wp_list_categories()
Работает на основе: get_terms()
✈ 1 раз = 0.005625с = очень медленно | 50000 раз = 11.98с = медленно | PHP 7.1.11, WP 4.9.5
Хуки из функции

Использование

$categories = get_categories( $args );

Шаблон использования

$categories = get_categories( array(
	'taxonomy'     => 'category',
	'type'         => 'post',
	'child_of'     => 0,
	'parent'       => '',
	'orderby'      => 'name',
	'order'        => 'ASC',
	'hide_empty'   => 1,
	'hierarchical' => 1,
	'exclude'      => '',
	'include'      => '',
	'number'       => 0,
	'pad_counts'   => false,
	// полный список параметров смотрите в описании функции http://wp-kama.ru/function/get_terms
) );

if( $categories ){
	foreach( $categories as $cat ){
		// Данные в объекте $cat

		// $cat->term_id
		// $cat->name (Рубрика 1)
		// $cat->slug (rubrika-1)
		// $cat->term_group (0)
		// $cat->term_taxonomy_id (4)
		// $cat->taxonomy (category)
		// $cat->description (Текст описания)
		// $cat->parent (0)
		// $cat->count (14)
		// $cat->object_id (2743)
		// $cat->cat_ID (4)
		// $cat->category_count (14)
		// $cat->category_description (Текст описания)
		// $cat->cat_name (Рубрика 1)
		// $cat->category_nicename (rubrika-1)
		// $cat->category_parent (0)

	}
}

Полный список параметров смотрите в get_terms().

taxonomy(строка)
Название таксономии, которую нужно обрабатывать. Добавлено с версии 3.0.
По умолчанию: 'category'
type(строка)

Тип категорий, которые будут получены.

  • post - категории для постов (по умолчанию);
  • link - разделы ссылок.
    По умолчанию: "post"
child_of(строка)
Получить дочерние категории (включая все уровни вложенности), указанной категории. В параметре указывается ID родительской категории (категория, вложенные категории которой нужно показать).
parent(число)
Получает категории родительская категория которых равна указанному в параметре ID. Отличие от child_of в том, что будет показан один уровень вложенности.
По умолчанию: ''
orderby(строка)

Сортировка полученных данных по определенным критериям. Например, по количеству постов в каждой категории или по названию категорий. Доступны следующие критерии:

  • ID - сортировка по ID;
  • name - сортировка по названию (по умолчанию);
  • slug - сортировка по алт. имени (slug);
  • count - по количеству записей в категории;
  • term_group - по группе.

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

order(строка)

Направление сортировки, указанной в параметре "orderby":

  • ASC - по порядку, от меньшего к большему (1, 2, 3; a, b, c);
  • DESC - в обратном порядке, от большего к меньшему (3, 2, 1; c, b, a).

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

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

Получать или нет пустые категории (не имеющие записей):

  • 1 (true) - не получать пустые,
  • 0 (false) - получать пустые.

По умолчанию: true

hierarchical(логический)
Если параметр установлен в true, то в результат будут включены пустые дочерние категории, дочерние категории которых имеют записи (непустые).
По умолчанию: true
exclude(строка/массив)
Исключить какие-либо категории из списка. Нужно указывать ID категорий через запятую или в массиве. Если этот параметр указан, параметр child_of будет отменен.
По умолчанию: ''
include(строка/массив)
Вывести списком только указанные категории. Указывать нужно ID категорий через запятую или в массиве.
По умолчанию: ''
number(число)
Лимит. Число категорий, которые будут получены. По умолчанию без ограничений - будут получены все категории.
pad_counts(логический)
Если передать true, то число которое показывает количество записей в родительских категориях будет суммой своих записей и записей из дочерних категорий.
По умолчанию: false

Примеры

#1 Выпадающий список

Для того, чтобы создать выпадающий список из категорий мы можем воспользоваться другой специальной для этой цели, функцией wp_dropdown_categories():

wp_dropdown_categories(array('hide_empty' => 0, 'name' => 'category_parent', 'orderby' => 'name', 'selected' => $category->parent, 'hierarchical' => true, 'show_option_none' => __('None')));

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

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

<select name="event-dropdown" onchange='document.location.href=this.options[this.selectedIndex].value;'>
 <option value=""><?php echo esc_attr('Выберите событие'); ?></option>
 <?php
  $categories=  get_categories('child_of=10');
  foreach ($categories as $category) {
	$option = '<option value="/category/archives/'.$category->category_nicename.'">';
	$option .= $category->cat_name;
	$option .= ' ('.$category->category_count.')';
	$option .= '</option>';
	echo $option;
  }
 ?>
</select>

#2 Список категорий и их описание

Этот пример покажет нам как можно вывести списком ссылки на категории, где сразу после каждой ссылки будет идти описание категории (указывается при создании/редактировании категории):

<?php
$categories = get_categories(array(
	'orderby' => 'name',
	'order' => 'ASC'
));
foreach( $categories as $category ){
	echo '<p>Category: <a href="' . get_category_link( $category->term_id ) . '" title="' . sprintf( __( "View all posts in %s" ), $category->name ) . '" ' . '>' . $category->name.'</a> </p> ';
	echo '<p> Description:'. $category->description . '</p>';
	echo '<p> Post Count: '. $category->count . '</p>';
}
?>

Код get categories: wp-includes/category.php VER 5.1.1

<?php
function get_categories( $args = '' ) {
	$defaults = array( 'taxonomy' => 'category' );
	$args     = wp_parse_args( $args, $defaults );

	$taxonomy = $args['taxonomy'];

	/**
	 * Filters the taxonomy used to retrieve terms when calling get_categories().
	 *
	 * @since 2.7.0
	 *
	 * @param string $taxonomy Taxonomy to retrieve terms from.
	 * @param array  $args     An array of arguments. See get_terms().
	 */
	$taxonomy = apply_filters( 'get_categories_taxonomy', $taxonomy, $args );

	// Back compat
	if ( isset( $args['type'] ) && 'link' == $args['type'] ) {
		_deprecated_argument(
			__FUNCTION__,
			'3.0.0',
			/* translators: 1: "type => link", 2: "taxonomy => link_category" */
			sprintf(
				__( '%1$s is deprecated. Use %2$s instead.' ),
				'<code>type => link</code>',
				'<code>taxonomy => link_category</code>'
			)
		);
		$taxonomy = $args['taxonomy'] = 'link_category';
	}

	$categories = get_terms( $taxonomy, $args );

	if ( is_wp_error( $categories ) ) {
		$categories = array();
	} else {
		$categories = (array) $categories;
		foreach ( array_keys( $categories ) as $k ) {
			_make_cat_compat( $categories[ $k ] );
		}
	}

	return $categories;
}

Cвязанные функции

Из раздела: Рубрики

24 коммента
Полезные 1 Все
  • SkiNNi

    hide_empty (логический)
    Получать (0) или нет (1) категории не имеющие записей (пустые категории).

    1 (false) - получать пустые;
    0 (true) - не получать пустые категории.

    На практике наоборот wink сп. за прекрасный handbook

    Ответить5.7 лет назад #
    • Albinos23 cайт: ixmaster.net

      Хотел написать об этом, но увидел Ваш комментарий)

      Ответить5.5 лет назад #
    • Kama7375

      1 (false) и 0 (true) - это конечно мощно я написал laugh Помнится мне было правильно, но мне кто-то сделал замечание, я спросони поправил...

      Спасибо поправил.

      Ответить5.5 лет назад #
      • Eugene cайт: aggreg.ru

        Предлагаю поправить еще раз: hide_epty=1 - означает "спрятать пустые", а не "получать пустые"

        Ответить5.3 лет назад #
  • wkuznet cайт: kontakt-plus.com

    в примере с выпадающим списком во второй строке ошибка.. функции aemribute_escape() не существует.. наверное имелась ввиду attribute_escape()

    Ответить5.4 лет назад #
    • Kama7375

      Спасибо, кроме того эта функция заменена на esc_attr().

      Ответить5.4 лет назад #
  • Михаил

    А как вывести Название категорий, и под каждой категорией чтобы были ее записи.

    Ответить5.3 лет назад #
    • Kama7375

      Получайте категории и через foreach(){} для каждой выводите записи с помощью WP_Query. Подробнее сами уж разбирайтесь, сорри...

      Ответить5.3 лет назад #
  • Иван

    забавно парсер у Вас меняет : DESC на смайлик smile

    Ответить5 лет назад #
  • Игорь

    сортировки "group" нет, есть "term_group"

    Ответить4.3 года назад #
  • Владислав cайт: balabanovich.ru

    Такой вопрос:
    Как в цикле foreach вывести изображение категории, котрое было задано с помощью Advanced Custom Fields? Уже что не писал — не хочет выводить изображение.

    И еще — у вас тут выскакивает окно после того как устанавливаю курсор в textarea — http://joxi.ru/752aYRPIb6Vw20

    Ответить4.3 года назад #
    • Александр cайт: nyama-nyama.ru

      у меня для таксономии сделано так:

      $queried_object = get_queried_object();
      $thumbnail = get_field('image', $queried_object);
      								$termicon='<div class="img_sh alignleft"><img src="'.$thumbnail['sizes']['thumbnail'].'" ></div>';

      Может поможет )

      Ответить4.3 года назад #
    • Vova cайт: www.howtomake.com.ua

      Владислав, в настройках поля ACF есть радиокнопка вернуть url изображения

      Ответить3.5 года назад #
  • Подскажите а как можно получить содержит ли категория подкатегории и их количество?

    1
    Ответить4 года назад #
    • Kama7375

      Получите дочерние рубрик с помощью get_terms(). Если в результате функция что-либо вернет, значит дочерние рубрики есть, если нет, то их нет:

      $term = get_queried_object();
      
      $children = get_terms( $term->taxonomy, array(
      'parent'    => $term->term_id,
      'hide_empty' => false
      ) );
      // get_terms вернет false если ничего не найдет
      if( $children ){
      	echo count( $children ); // количество доч. рубрик
      	// дочерние рубрики существуют
      }
      Ответить4 года назад #
  • @ Alex

    Почему нету данных по производительности?
    Добавьте если есть возможность.

    п.с. интересует некоторое сравнение с get_posts

    Ответитьгод назад #
    • Kama7375

      Добавил! Вообще, скорость можно было посмотреть в get_terms()... Ну и в данном случае скорость будет зависить от кол-ва терминов...

      Ответитьгод назад #
      • @ Alex

        ну и как понять тогда ваше предложение "сравнения", если:
        get_terms():
        1 раз = 0.01662с = тормоз | 50000 раз = 33.99с = очень медленно PHP 7.1.11, WP 4.9.5
        а его производная - get_categories():
        1 раз = 0.006315с = очень медленно | 50000 раз = 21.49с = медленно PHP 7.1.11, WP 4.9.5

        Ответитьгод назад #
        • Kama7375

          Для get_terms вызывался код:

          $terms = get_terms( 'post_tag' );

          Для get_categories:

          $categories = get_categories(array(
          	'orderby' => 'name',
          	'order' => 'ASC'
          ));

          Перезапустил проверки, примерно также выдает. Тут ведь все зависит от количества данных в БД (т.е. таксономии), он параметров сортировки и других...

          Убрал сча у get_categories() параметры сортировки и выдает тоже самое, видимо от объема данных зависит, ну и может там еще какие-то параметры отличаются по умолчанию... Эти показатели - это очень примерно, особенно для этих функций, где очень многое зависит от параметров запроса... Для некоторых функций они отлично показывают и дают представление о работе функции, например, is_user_logged_in(), а для других почти не имеют смысла, например, как вот эти функции, но все же это лучше чем ничего, тут хоть видно как кэш срабатывает, когда видишь разницу с 1 и многими запросами.

          Ответитьгод назад #
Здравствуйте, !     Войти . Зарегистрироваться