Добавление фильтра по таксономиям

Сколько у вас постов на блоге? 100 или может быть 10000? Согласитесь, что при огромном количестве записей бывает полезно отобразить только содержимое какой-нибудь конкретной категории в админке. Правда сам я, если вдруг что, пользуюсь поиском, но тем не менее :)

Для этого есть фильтр по рубрикам, который находится на странице с записями:

стандартный фильтр по рубрикам

Окей, вроде всё норм, но однажды у меня один клиент попросил добавить фильтр по таксономиям. Вот типо того:

фильтер по таксономиям в WordPress

Знаете, я недавно видел статью (не стану называть автора), в которой проводился обзор: что лучше — Joomla или WordPress, там говорилось, что:

  • якобы WordPress подходит только для блогов,
  • якобы WordPress очень ограничен по функционалу и возможностям в отличие от джумлы

Возможности в WordPress не ограничены, по крайней мере я с границами пока что не столкнулся и эта статья тому подтверждение. Это было небольшое отступление, а теперь за дело.

function true_taxonomy_filter() {
	global $typenow; // тип поста
	if( $typenow == 'post' ){ // для каких типов постов отображать
		$taxes = array('platform', 'game'); // таксономии через запятую
		foreach ($taxes as $tax) {
			$current_tax = isset( $_GET[$tax] ) ? $_GET[$tax] : '';
			$tax_obj = get_taxonomy($tax);
			$tax_name = mb_strtolower($tax_obj->labels->name);
			// функция mb_strtolower переводит в нижний регистр
			// она может не работать на некоторых хостингах, если что, убирайте её отсюда
			$terms = get_terms($tax);
			if(count($terms) > 0) {
				echo "<select name='$tax' id='$tax' class='postform'>";
				echo "<option value=''>Все $tax_name</option>";
				foreach ($terms as $term) {
					echo '<option value='. $term->slug, $current_tax == $term->slug ? ' selected="selected"' : '','>' . $term->name .' (' . $term->count .')</option>'; 
				}
				echo "</select>";
			}
		}
	}
}
 
add_action( 'restrict_manage_posts', 'true_taxonomy_filter' );

Ну как бы и добавить больше нечего, исчерпывающий код :) вставляем в файл functions.php вашей темы и радуемся.

P.S. Если хотите удалить при этом стандартный фильтр по рубрикам, используйте вот этот код:

add_filter( 'wp_dropdown_cats', '__return_false' );

После удаления фильтра по рубрикам может показаться логичным ещё и удаление колонки с рубриками, но эта тема затронута в отдельном посте.

Подпишитесь, чтобы раз в неделю получать свежие статьи с блога по email.

Смотрите также

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

  • Виктор28 августа 2012 в 18:08 #

    Здравствуйте, я пытаюсь сделать фильтры в интернет магазине на WP. Таксономий довольно много, может лучше организовать все с помощью плагина? Не посоветуете какой нибудь, желательно русифицированный...

    Заранее благодарен

  • Владимир2 сентября 2012 в 09:09 #

    Пробую вставить фильтр как вы описываете, в functions.php вставил, таксономии свои подставил, Вопрос - а как сам фильтр собственно вставить на сайт???

  • Евгений21 апреля 2013 в 16:04 #

    А как добавить стандартный фильтр по категориям к своей таксономии?

    • Миша22 апреля 2013 в 05:04 #
      4
      
      $taxes = array('category');  // таксономии через запятую
      • Евгений22 апреля 2013 в 10:04 #

        Указал:
        'taxonomies' => array('category','post_tag', 'katalog')

        Появился поиск по категориям, а таксономии не добавились. Не подскажите как в фильтр добавить таксономии.

        • Миша23 апреля 2013 в 08:04 #

          можно скриншот того, что появилось?

          • Евгений23 апреля 2013 в 09:04 #

            Я создал свой произвольный тип записей. С помощью ‘taxonomies’ => array(‘category’,'post_tag’, ‘katalog’) добавил фильтр но в нем нет поиска по рубрикам из моего произвольного типа записей katalog. В фильтре только рубрики из post

            • Миша25 апреля 2013 в 12:04 #

              что значит нет поиска?
              то есть выпадающий список не появился? появился только для category и post_tag, верно? а нужно и для katalog?

              • Евгений25 апреля 2013 в 12:04 #

                выпадающий список появился но нет рубрик из katalog, а для category и post_tag - есть.

                • Миша25 апреля 2013 в 16:04 #

                  ну надо смотреть и тестить, замени короче тогда 18 строчку в коде на:

                  18
                  
                  } else echo '0';

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

                  • Евгений25 апреля 2013 в 16:04 #

                    Миша, спасибо большое за помощь! Да у меня был другой код. Подправил по аналогии с твоим и все получилось. Еще раз большое спасибо!

                    • Миша25 апреля 2013 в 19:04 #

                      пожалуйста)

  • Mikola1 сентября 2014 в 00:09 #

    Спасибо тебе огромное, ну просто очень помогла статья, несколько дней боролся с созданием фильтра для произвольного типа записей, и наконец победил его благодаря этой статье. Все отлично прокомментировано, поэтому сразу стало понятно где что менять.

  • Анна1 января 2015 в 19:01 #

    Добрый вечер! Спасибо за код для фильтрации по таксономиям. Отрабатывает как положено. Только у меня на экране редактирования таксономии (пока я ничего не нажимаю), просто перешла на экран редактирования и все - в, добавленном с помощью Вашего кода, поле фильтрации, в выпадающем списке термов для каждого терма отображаются Notice: Undefined index: здесь название таксономии и номер строки.
    Строку указывает вот эту: echo 'slug, $_GET[$tax] == $term->slug ? ' selected="selected"' : '','>' . $term->name .' (' . $term->count .')';
    Можете подсказать в чем причина и как ее устранить?
    Спасибо!!!

  • Анна1 января 2015 в 20:01 #

    могу прислать скрин если нужно. только сообщите куда присылать. Кстати, после применения фильтрации по этому столбцу - предупреждение исчезает и все работает превосходно.
    Очень нужна ваша помощь, я уже пересмотрела все возможные примеры в нете, но только Ваш отрабатывает полноценно, за исключением этих Notice.

    • Миша2 января 2015 в 08:01 #

      Добрый день!
      Код обновил - попробуйте. Напишите пожалуйста, если ошибка исчезла.

      • Анна2 января 2015 в 11:01 #

        Огромное Вам спасибище!!! Теперь ошибок нету))))))))
        Успехов и процветания Вам в Новом году!!!

        • Миша3 января 2015 в 08:01 #

          Рад, что всё получилось. Благодарю)) Вам тоже)

          • Анна14 января 2015 в 19:01 #

            Здравствуйте! у меня снова вопрос по фильтрации. Если имя элемента таксономии отличается от слага, то выборка по нему осуществляется, но значение в не изменяется. Там по-прежнему отображается "Все {термы}". Подскажите пожалуйста что и где исправить? Спасибо!

            • Миша15 января 2015 в 08:01 #

              Здравствуйте!
              То есть получается переменная $_GET[$tax] содержит имя элемента таксономии?

              • Анна15 января 2015 в 11:01 #

                Да. вроде бы Вы указали мне на ошибку. Я поняла что нужно исправить. Сейчас еще хорошенько потестирую. Если что отпишусь. Заранее спасибо!

  • Максим28 мая 2015 в 10:05 #

    Извините, а можно поподробнее описать куда именно в файле functions.php этот код вставлять. И как привязать его к стандартному поиску WordPress.

  • pro100light1 ноября 2015 в 02:11 #

    А можно фильтр по меткам сделать?

  • Вася10 января 2016 в 13:01 #

    А как сделать такой же фильтр по авторам?

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

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

  • eveniy: Добрый день Михаил, подскажите на примере как добавить свои произвольные поля в в вашу форму фильтрации: Я так понимаю...

  • Миша: Отлично! )

  • Дмитрий: сам разобрался: в настройках кастомного типа записи недавно оптимизировал настройки и переоптимизировал: в аргументе 'ta...

  • Дмитрий: У меня по какой-то причине пропало отображение (как в колонке меню слева, так и метабокс в записях ) раздела рубрик для...