WordPress как на ладони

get_categories()WP 2.1.0

Получает категорий в виде массива объектов.

По каким критериям получить категории и как их отсортировать указывается в параметрах функции.

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

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

Возвращает

Массив.

  • Массив объектов WP_Term (категорий).
  • Пустой массив, если не удалось получить категории.
Array
(
	[0] => WP_Term Object
		(
			[term_id] => 7
			[name] => Codex
			[slug] => codex
			[term_group] => 0
			[term_taxonomy_id] => 7
			[taxonomy] => category
			[description] =>
			[parent] => 3
			[count] => 17
			[filter] => raw
			[term_order] => 1
			[cat_ID] => 7
			[category_count] => 17
			[category_description] =>
			[cat_name] => Codex
			[category_nicename] => codex
			[category_parent] => 3
		)

	[1] => WP_Term Object ( ... )
	...
)

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

$categories = get_categories( [
	'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)

	}
}

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

$categories = get_categories( $args );
$args(массив|строка)
Параметры для получения категорий.
По умолчанию: '' - предустановки

Аргументы $args

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

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

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

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

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

  • id или term_id - по ID.
  • name - по названию. По умолчанию.
  • count - по полю count в term_taxonomy - по количеству записей.
  • slug - по альтернативному названию.
  • description - по описанию.
  • term_group - по группе.
  • term_group - по группе.
  • parent - по полю parent.

  • include - по порядку указанному в параметре $include
  • slug__in - с версии 4.9. В порядке указанном в параметре $slug.
  • meta_value - по значению произвольного поля
  • meta_value_num - по значению произвольного поля, значение будет интерпретироваться как число, а не строка.
  • ключ "meta_query" - в параметре $meta_query мы можем указать параметры запроса по метаполям, и там же указать ключ для конкретного запроса. Этот ключ можно использовать как ключ для сортировки по соответствующему метаполю.
  • none - не сортировать

По умолчанию: "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

Примеры

0

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

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

<?php
$categories = get_categories( [
	'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: '. (int) $category->count . '</p>';
}
?>
0

#2 Получение только категорий верхнего уровня

Для этого, установите значение 'parent' => 0. Этот пример получает ссылку и название категорий верхнего уровня.

$cats = get_categories( array(
	'orderby' => 'name',
	'parent'  => 0
) );

foreach ( $cats as $cat ) {

	printf( '<a href="%1$s">%2$s</a><br />',
		esc_url( get_category_link( $cat->term_id ) ),
		esc_html( $cat->name )
	);
}
0

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

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

wp_dropdown_categories( [
	'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="' . get_term_link( $category ) . '">';
		$option .= $category->name;
		$option .= ' (' . $category->count . ')';
		$option .= '</option>';

		echo $option;
	}
	?>

</select>
-1

#4 Получим только категории в которых есть посты

По умолчанию функция get_category() возвращает ТОЛЬКО категории, в которых есть посты (не пустые категории). Это означает, что если для категории не назначен пост, то такая категория не будет получена.

Чтобы этого избежать и показать все категории независимо есть в ней посты или нет, нужно указать параметр 'hide_empty' => false:

$args = array(
	'hide_empty' => false,
);

$cats = get_categories( $args ); // вернет все категории (включая пустые)

Заметки

  • Смотрите: get_terms() Type of arguments that can be changed.

Список изменений

С версии 2.1.0 Введена.

Код get_categories() WP 6.0

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

	/**
	 * 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().
	 */
	$args['taxonomy'] = apply_filters( 'get_categories_taxonomy', $args['taxonomy'], $args );

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

	$categories = get_terms( $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;
}
22 комментария
Полезные 1 Все
    Войти