wp_dropdown_categories()WP 2.1.0

Отображает или получает выпадающий список категорий в HTML формате. Вместо рубрик можно указать название произвольной таксономии.

Хуки из функции

Возвращает

Строку. HTML код выпадающего списка категорий (<select>).

Шаблон использования
$args = array(
	'show_option_all'    => '',
	'show_option_none'   => '',
	'option_none_value'  => -1,
	'orderby'            => 'ID',
	'order'              => 'ASC',
	'show_last_update'   => 0,
	'show_count'         => 0,
	'hide_empty'         => 1,
	'child_of'           => 0,
	'exclude'            => '',
	'echo'               => 1,
	'selected'           => 0,
	'hierarchical'       => 0,
	'name'               => 'cat',
	'id'                 => 'name',
	'class'              => 'postform',
	'depth'              => 0,
	'tab_index'          => 0,
	'taxonomy'           => 'category',
	'hide_if_empty'      => false,
	'value_field'        => 'term_id',
	'required'           => false,
);

wp_dropdown_categories( $args );

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

wp_dropdown_categories( $args );
$args(строка/массив)
Массив аргументов которые нужно изменить. Можно указать как строку запроса.
По умолчанию: массив аргументов по умолчанию

Аргументы параметра $args

Кроме этих параметров можно указать еще и от функции get_terms().

show_option_all(строка)
Текст для показа всех категорий. Будет начальным текстом в списке.
По умолчанию: ''
show_option_none(строка)
Текст для показа <option> пункта "без категорий" (когда ничего не выбрано). Будет начальным <option> в списке или вторым, если установлен параметр show_option_all.
По умолчанию: ''
option_none_value(строка)
Значение для <option> если установлен параметр show_option_none.
По умолчанию: -1
orderby(строка)

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

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

Направление сортировки:

  • ASC - по порядку, от меньшего к большему (1, 2, 3; a, b, c);
  • DESC - в обратном порядке, от большего к меньшему (3, 2, 1; c, b, a).
    По умолчанию: 'ASC'
show_last_update(строка/массив)
Показать последнее обновление категории 1 - да, 0 - нет (у меня при изменении параметра ничего не поменялось).
По умолчанию: false
show_count(логический)

Показывать (1) или нет (0) количество записей в категории. Число записей будет показано после названия категории в скобках (например, Психология (16)).

  • 1 (true) - показывать количество записей;
  • 0 (false) - не показывать количество записей.
hide_empty(Логический)

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

  • 0 (true) - показывать пустые;
  • 1 (false) - не показывать пустые категории.
    По умолчанию: 1
child_of(строка/массив)
Показать дочерние категории. В параметре указывается ID родительской категории (категория, вложенные категории которой нужно показать).
По умолчанию: ''
exclude(строка/число)
ID категорий, которые нужно исключить. Указывать через запятую.
По умолчанию: ''
exclude_tree(строка/массив)
ID родительской категории, дерево которой не нужно показывать. Дерево категории - это категория и все в нее вложенные категории.
echo(логический)
1 - выводить результат на экран. 0 - возвращать для обработки.
По умолчанию: 1
depth(число)
Глубина вложенности дочерних категорий. Игнорируется если параметр hierarchical отключен.
По умолчанию: 0
tab_index(строка)
Значение атрибута tabindex у HTML тега <select>
name(строка)
Значение атрибута name у HTML тега <select>
По умолчанию: cat
id(строка)
Значение атрибута ID у тега <select>
По умолчанию: как у name
class(строка)
Атрибут class для select элемента.
По умолчанию: 'postform'
selected(число/строка)
Какой элемент нужно выделить. Сравнивается со значением value_field. Обычно тут указывается ID категории, которая должна быть выделена.
По умолчанию: выставляется ID просматриваемой категории, если юзер на странице категории.
hierarchical(число|логический)
Выводить категории в виде дерева. 1 - да, показать как дерево, 0 - вывести сплошным списком.
По умолчанию: 0
pad_counts(логический)
Подсчитывать количество постов для родительских категорий, как сумма всех постов во вложенных категориях. Если параметры show_counts и hierarchical включены, этот параметр включается автоматически (становится true).
По умолчанию: false
taxonomy(строка)
Название таксономии с которой будет работать функция.
По умолчанию: 'category'
hide_if_empty(логический)
Прятать выпадающий список если вернулся пустой результат? true - да, не показывать список, если нет категорий. false - показывать пустой список.
По умолчанию: false
value_field(строка)

Поле термина, которое будет выводиться в value у <option>. Может быть:

  • term_id
  • name
  • slug
  • term_group
  • term_taxonomy_id
  • taxonomy
  • description
  • parent
  • count ( c версии WP 4.2 )

По умолчанию: 'term_id'

required(логический)
Добавлять ли к <select> атрибут HTML5 'required'. С версии 4.6.
По умолчанию: false
aria_describedby(строка) (WP 6.1)
'id' элемента, который содержит описательный текст для выбора.
По умолчанию: ''

Примеры

3

#1 Добавим параметр multiple

// This filter allow a wp_dropdown_categories select to return multiple items
add_filter( 'wp_dropdown_cats', 'willy_wp_dropdown_cats_multiple', 10, 2 );
function willy_wp_dropdown_cats_multiple( $output, $r ) {

	if ( ! empty( $r['multiple'] ) ) {
		$output = preg_replace( '/<select(.*?)>/i', '<select multiple="multiple">', $output );
		$output = preg_replace( '/name=([\'"]{1})(.*?)/i', 'name=[]', $output );
	}

	return $output;
}

Теперь используем функцию с параметром multiple

wp_dropdown_categories( [
	'taxonomy'   => 'category',
	'multiple'   => true,
	'selected'   => '10, 12', // selected terms…
	'hide_empty' => false,
] );

Получим:

Оригинальный код находится здесь.

0

#2 Выпадающий список с кнопкой Submit

Пример вывода выпадающего списка категорий с кнопкой сабмита:

<h2>Категории:</h2>
<form action="<?php bloginfo('url'); ?>" method="get">
	<?php wp_dropdown_categories('show_count=1&hierarchical=1'); ?>
	<input type="submit" name="submit" value="view" />
</form>
0

#3 Выпадающий список с использованием Javascript (без кнопки Сабмита)

Пример, демонстрирующий использование аргумента show_option_none:

<h2>Категории:</h2>
<?php wp_dropdown_categories('show_option_none=Select category'); ?>

<script>
	var dropdown = document.getElementById("cat");
	function onCatChange() {
		if ( dropdown.options[dropdown.selectedIndex].value > 0 ) {
			location.href = "<?php echo get_option('home');
?>/?cat="+dropdown.options[dropdown.selectedIndex].value;
		}
	}
	dropdown.onchange = onCatChange;
</script>
0

#4 Выпадающий список с использованием Javascript (2) (без кнопки Сабмита)

<h2><?php _e('Posts by Category'); ?></h2>
<form action="<?php bloginfo('url'); ?>/" method="get">
	<div>
	<?php
	$select = wp_dropdown_categories('show_option_none=Select category&show_count=1&orderby=name&echo=0');
	$select = preg_replace("#<select([^>]*)>#", "<select onchange='return this.form.submit()'>", $select);
	echo $select;
	?>
		<noscript><div><input type="submit" value="View" /></div></noscript>
		</div>
</form>

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

С версии 2.1.0 Введена.
С версии 4.2.0 Introduced the value_field argument.
С версии 4.6.0 Introduced the required argument.
С версии 6.1.0 Introduced the aria_describedby argument.

Код wp_dropdown_categories() WP 6.6.2

function wp_dropdown_categories( $args = '' ) {
	$defaults = array(
		'show_option_all'   => '',
		'show_option_none'  => '',
		'orderby'           => 'id',
		'order'             => 'ASC',
		'show_count'        => 0,
		'hide_empty'        => 1,
		'child_of'          => 0,
		'exclude'           => '',
		'echo'              => 1,
		'selected'          => 0,
		'hierarchical'      => 0,
		'name'              => 'cat',
		'id'                => '',
		'class'             => 'postform',
		'depth'             => 0,
		'tab_index'         => 0,
		'taxonomy'          => 'category',
		'hide_if_empty'     => false,
		'option_none_value' => -1,
		'value_field'       => 'term_id',
		'required'          => false,
		'aria_describedby'  => '',
	);

	$defaults['selected'] = ( is_category() ) ? get_query_var( 'cat' ) : 0;

	// 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';
	}

	// Parse incoming $args into an array and merge it with $defaults.
	$parsed_args = wp_parse_args( $args, $defaults );

	$option_none_value = $parsed_args['option_none_value'];

	if ( ! isset( $parsed_args['pad_counts'] ) && $parsed_args['show_count'] && $parsed_args['hierarchical'] ) {
		$parsed_args['pad_counts'] = true;
	}

	$tab_index = $parsed_args['tab_index'];

	$tab_index_attribute = '';
	if ( (int) $tab_index > 0 ) {
		$tab_index_attribute = " tabindex=\"$tab_index\"";
	}

	// Avoid clashes with the 'name' param of get_terms().
	$get_terms_args = $parsed_args;
	unset( $get_terms_args['name'] );
	$categories = get_terms( $get_terms_args );

	$name     = esc_attr( $parsed_args['name'] );
	$class    = esc_attr( $parsed_args['class'] );
	$id       = $parsed_args['id'] ? esc_attr( $parsed_args['id'] ) : $name;
	$required = $parsed_args['required'] ? 'required' : '';

	$aria_describedby_attribute = $parsed_args['aria_describedby'] ? ' aria-describedby="' . esc_attr( $parsed_args['aria_describedby'] ) . '"' : '';

	if ( ! $parsed_args['hide_if_empty'] || ! empty( $categories ) ) {
		$output = "<select $required name='$name' id='$id' class='$class'$tab_index_attribute$aria_describedby_attribute>\n";
	} else {
		$output = '';
	}
	if ( empty( $categories ) && ! $parsed_args['hide_if_empty'] && ! empty( $parsed_args['show_option_none'] ) ) {

		/**
		 * Filters a taxonomy drop-down display element.
		 *
		 * A variety of taxonomy drop-down display elements can be modified
		 * just prior to display via this filter. Filterable arguments include
		 * 'show_option_none', 'show_option_all', and various forms of the
		 * term name.
		 *
		 * @since 1.2.0
		 *
		 * @see wp_dropdown_categories()
		 *
		 * @param string       $element  Category name.
		 * @param WP_Term|null $category The category object, or null if there's no corresponding category.
		 */
		$show_option_none = apply_filters( 'list_cats', $parsed_args['show_option_none'], null );
		$output          .= "\t<option value='" . esc_attr( $option_none_value ) . "' selected='selected'>$show_option_none</option>\n";
	}

	if ( ! empty( $categories ) ) {

		if ( $parsed_args['show_option_all'] ) {

			/** This filter is documented in wp-includes/category-template.php */
			$show_option_all = apply_filters( 'list_cats', $parsed_args['show_option_all'], null );
			$selected        = ( '0' === (string) $parsed_args['selected'] ) ? " selected='selected'" : '';
			$output         .= "\t<option value='0'$selected>$show_option_all</option>\n";
		}

		if ( $parsed_args['show_option_none'] ) {

			/** This filter is documented in wp-includes/category-template.php */
			$show_option_none = apply_filters( 'list_cats', $parsed_args['show_option_none'], null );
			$selected         = selected( $option_none_value, $parsed_args['selected'], false );
			$output          .= "\t<option value='" . esc_attr( $option_none_value ) . "'$selected>$show_option_none</option>\n";
		}

		if ( $parsed_args['hierarchical'] ) {
			$depth = $parsed_args['depth'];  // Walk the full depth.
		} else {
			$depth = -1; // Flat.
		}
		$output .= walk_category_dropdown_tree( $categories, $depth, $parsed_args );
	}

	if ( ! $parsed_args['hide_if_empty'] || ! empty( $categories ) ) {
		$output .= "</select>\n";
	}

	/**
	 * Filters the taxonomy drop-down output.
	 *
	 * @since 2.1.0
	 *
	 * @param string $output      HTML output.
	 * @param array  $parsed_args Arguments used to build the drop-down.
	 */
	$output = apply_filters( 'wp_dropdown_cats', $output, $parsed_args );

	if ( $parsed_args['echo'] ) {
		echo $output;
	}

	return $output;
}