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

Сколько у вас постов на блоге? 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' );

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

Миша

В последние годы я долго не знал, что мне делать с сайтом misha.blog, ведь он практически не приносит никакого профита, но недавно я осознал, что моя миссия – способствовать распространению WordPress. Ведь WordPress – это лучший движок для разработки сайтов – как для тех, кто готов использовать заложенную структуру этой CMS, так и для тех, кто предпочитает headless решения.

Сам же я впервые познакомился с WordPress в 2009 году. Организатор WordCamp. Преподаватель в школах Epic Skills и LoftSchool.

Если вам нужна помощь с вашим сайтом или может даже разработка с нуля на WordPress / WooCommerce — пишите. Я и моя команда сделаем вам всё на лучшем уровне.

Комментарии — 36

Комментирование этого поста более не доступно.
  • Виктор 28 августа 2012 #

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

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

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

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

    • Миша 4 сентября 2012 #

      фильтр для сайта нужно будет писать ручками уже))

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

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

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

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

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

        • Миша 23 апреля 2013 #

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

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

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

            • Миша 25 апреля 2013 #

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

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

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

                • Миша 25 апреля 2013 #

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

                  } else echo '0';

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

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

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

                    • Миша 25 апреля 2013 #

                      пожалуйста)

  • Mikola 1 сентября 2014 #

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

  • Анна 1 января 2015 #

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

  • Анна 1 января 2015 #

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

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

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

      • Анна 2 января 2015 #

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

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

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

          • Анна 14 января 2015 #

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

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

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

              • Анна 15 января 2015 #

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

                • Миша 16 января 2015 #

                  Хорошо, обращайтесь 🙂

  • Максим 28 мая 2015 #

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

    • Миша 29 мая 2015 #

      В любое место после открывающего тега <?php.

  • pro100light 1 ноября 2015 #

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

    • Миша 1 ноября 2015 #

      По любой таксономии.

  • Вася 10 января 2016 #

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

    • Миша 10 января 2016 #

      Спасибо за отличную идею поста, следующим опубликую.

      • Вася 10 января 2016 #

        А пока хоть намекнуть куда смотреть, а ? 😉

      • Вася 10 января 2016 #

        И ещё как идею 😉

        Есть такая штука http://harvesthq.github.io/chosen/
        И на ёе базе есть ряд плагинов ( https://wordpress.org/plugins/wp-chosen/ - один из) Весьма полезная штука, только работает криво. Вот пост по нормальной интеграции этого chosen-а (как включать только там, там где надо) был бы весьма полезен 😉

        • Миша 12 января 2016 #

          Хорошо, приму к сведению 🙂

  • Alexey 2 февраля 2020 #

    Добрый день.
    Как можно сделать фильтрацию . чтобы показывались только записи текущего автора?
    Спасибо

    • Миша 4 февраля 2020 #

      Добрый день!

      Через pre_get_posts и при помощи функции get_current_user_id() я думаю.