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

wp_dropdown_categories() WP 2.1

Выводит на экран выпадающий список категорий (рубрик). Имеет множество настроек. Вместо рубрик можно указать название произвольной таксономии.

Хуки из функции:
Возвращает

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

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

wp_dropdown_categories( $args );
Шаблон использования
$args = array(
	'show_option_all'    => '',
	'show_option_none'   => '',
	'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', // значение value e option
	'required'           => false,
); 

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

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

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

show_option_all(строка)
Текст для показа всех категорий. Будет начальным текстом в списке.
По умолчанию: ''
show_option_none(строка/массив)
Текст для показа пункта списка "без категорий". Будет начальным текстом в списке или вторым, если установлен параметр show_option_all.
По умолчанию: ''
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/flase
tab_index(строка)
Значение атрибута tabindex у HTML тега <select>
name(строка)
Значение атрибута name у HTML тега <select>
По умолчанию: cat
id(строка)
Значение атрибута ID у тега <select>
По умолчанию: как у name
class(строка)
Атрибут class для select элемента.
По умолчанию: 'postform'
selected(число)
ID категории, которая должна быть выделена. По умолчанию: по умолчанию выставляется ID просматриваемой категории, если юзер на странице категории.
hierarchical(логический)
Выводить категории в виде дерева. 1 - да, показать как дерево, 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

Примеры

#1 Выпадающий список с кнопкой 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>

#2 Выпадающий список с использованием 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>

#2.1. Выпадающий список с использованием 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$1 onchange='return this.form.submit()'>", $select);
echo $select;
?>
	<noscript><div><input type="submit" value="View" /></div></noscript>
	</div></form>

Код wp dropdown categories: wp-includes/category-template.php WP 4.8.2

<?php
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,
	);

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

	// 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>'
			)
		);
		$args['taxonomy'] = 'link_category';
	}

	$r = wp_parse_args( $args, $defaults );
	$option_none_value = $r['option_none_value'];

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

	$tab_index = $r['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 = $r;
	unset( $get_terms_args['name'] );
	$categories = get_terms( $r['taxonomy'], $get_terms_args );

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

	if ( ! $r['hide_if_empty'] || ! empty( $categories ) ) {
		$output = "<select $required name='$name' id='$id' class='$class' $tab_index_attribute>\n";
	} else {
		$output = '';
	}
	if ( empty( $categories ) && ! $r['hide_if_empty'] && ! empty( $r['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 Taxonomy element to list.
		 */
		$show_option_none = apply_filters( 'list_cats', $r['show_option_none'] );
		$output .= "\t<option value='" . esc_attr( $option_none_value ) . "' selected='selected'>$show_option_none</option>\n";
	}

	if ( ! empty( $categories ) ) {

		if ( $r['show_option_all'] ) {

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

		if ( $r['show_option_none'] ) {

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

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

	if ( ! $r['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  $r      Arguments used to build the drop-down.
	 */
	$output = apply_filters( 'wp_dropdown_cats', $output, $r );

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

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

Из метки: Список (wp_list списки)

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

wp_dropdown_categories 22 комментария
  • Виталий Гладков cайт: www.websoldier.ru

    Огромное, спасибо автору, за подробное описание данной функции и пример кода с javascripts! Очень помогло разобраться, долго искал. smile

    Ответить3.8 года назад #
  • Сергей @

    Как показать категории, только для текущего тэга?

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

      Это нереально. Теги и категории прикрепляются к постам и между собой никак по сути не связаны. Можно попробовать получить посты тега и затем получить категории этих постов, если в этом есть смысл вообще... Как это сделать я не знаю.

      1
      Ответить3.7 года назад #
      • Сергей

        У меня тэги это названия магазинов. Когда человек нажимает на тэг, мне надо чтобы показались те категории, которые принадлежат этому тегу. Это реально сделать?

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

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

          Ответить3.7 года назад #
  • Вячеслав

    А можно как-то вывести не только имя категории но и ее id ?

    Ответить2.5 года назад #
    • campusboy1833 cайт: wp-plus.ru

      Можно, для этого надо массив данных в функцию передать, где echo будет равно нулю. Возвращаемые данные поместить в массив и с помошью var_damp ($arr) посмотреть, что внутри. А там много чего интересного, в том числе и ID рубрик. С помощью foreach затем обработать и вывести массив в нужном виде.

      Ответить2.5 года назад #
  • Николай

    Этой функцией выводится только для типа записей post? Или всех типов?

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

      Эта функция выводит таксономии (категории). В параметре taxonomy можно указать элементы какой именно таксономии нужно выводить...

      Типы записей тут не при чем, единственное где они косвенно участвуют это в определении выводить пустые элементы (где нет записей) или нет, но тут считаются рубрики в которых есть любые типы записей (зависит от того к какому типу записи, какая таксономия прикреплена).

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

    А для конкретного поста selected не выставляется?

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

      Для поста нет. Но если юзер на странице категории, по умолчанию выставляется ID просматриваемой категории:

      $defaults['selected'] = ( is_category() ) ? get_query_var( 'cat' ) : 0;
      Ответить1.9 года назад #
  • Добавьте параметр parent в описание данной функции.

    Ответить1.5 года назад #
  • avense4 cайт: videovegas.ru

    А можно этой функцией или какой нибудь еще аналогичной сделать возможность выводить только включенные категории? Типа как здесь параметр exclude только надо наоборот include

    Ответить1.2 года назад #
    • campusboy1833 cайт: wp-plus.ru

      Можно с помощью get_categories

      2
      Ответить1.2 года назад #
      • avense4 cайт: videovegas.ru

        Да, уже нашел. Пришлось переделывать под функцию get_categories()
        Надо было сразу с ней делать, там больше возможностей.

        Ответить1.2 года назад #
  • Lyubov Shangar cайт: depil.kiev.ua

    Я так понимаю что сначала нужно установить плагин для управления таксономами, а потом уже добавлять туда код, правильно?

  • Алексей @

    Доброй ночи! подскажите в выпадающем списке с использованием Javascript №2 выводятся категории вида http://sait.ru/?cat=номер категории. А как сделать тоже самое для пользовательской таксономии?

         'Все записи',
    	'orderby'            => 'count',
    	'order'              => 'DESC',
    	'taxonomy'           => 'tax',
    	'show_count'         => 1);
    
    wp_dropdown_categories( $args ); ?>
    
    	var dropdown = document.getElementById("cat");
    	function onCatChange() {
    		if ( dropdown.options[dropdown.selectedIndex].value > 0 ) {
    			location.href = "/?cat="+dropdown.options[dropdown.selectedIndex].value;
    		}
    	}
    	dropdown.onchange = onCatChange;

    При таком выводе получается, например, http://sait.ru/?cat=21 , где 21 это id таксономии, но он не находит эту страницу. Пишет что не найдено.
    Возможно надо изменить "cat" или еще как то.

    • Алексей @

      Посмотрел как выводится таксономия: sait.ru/?tax=slug(текущей таксономии).

  • Олег

    Не получается заставить работать фильтр wp_dropdown_cats.
    Пытаюсь словить результат в контексте post_categories_meta_box:

    add_filter( 'wp_dropdown_cats', '__return_false', 9999 );

    или

    function filter_wp_dropdown_cats( $output, $r ) {}
    add_filter( 'wp_dropdown_cats', 'filter_wp_dropdown_cats', 10, 2 );

    никакой реакции - все продолжает выводиться.

    Ответить3 месяца назад #
    • campusboy1833 cайт: wp-plus.ru

      Попробовал на виджете "Рубрики", оба твои варианта срабатывают - ничего не выводится. Почему так уверен, что в том метабоксе именно эта функция работает?

      1
      Ответить3 месяца назад #

Здравствуйте, !

Ваш комментарий