Статьи

Индивидуальные фильтры администрирования WordPress

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

Мы подробно опишем, что такое фильтры WordPress и как они служат для отображения ваших записей. Оттуда мы узнаем, как вы можете расширить свою область после администрирования — создав новые настраиваемые фильтры администрирования WordPress.

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

Фильтрация сообщений

WordPress выведет свои фильтры по умолчанию на экран администрирования сообщений. Эти фильтры позволяют отображать только определенные сообщения, которые соответствуют установленным критериям. Например, вы можете отображать публикации, опубликованные в установленный период времени (как показано ниже).

Почтовая фильтрация WordPress по умолчанию

WordPress поставляется с несколькими фильтрами, которые можно использовать на экране администрирования сообщений. Дополнительные фильтры могут быть добавлены определенными темами и плагинами и предоставляют дополнительные фильтры для использования.

В целом, эти фильтры служат той же цели, позволяя вам сузить список сообщений на основе набора критериев, просматривая только сообщения, которые соответствуют заданным критериям.

Добавление ваших собственных фильтров

В то время как WordPress поставляется с собственным отличным набором фильтров, часто вы можете захотеть добавить свои собственные, чтобы помочь вашим пользователям (или вам самим) сузить количество сообщений на экране администрирования.

Вы можете добавить дополнительные фильтры на свой сайт с помощью двух хуков

  • restrict_manage_posts
  • pre_get_posts

Эти два крючка, когда объединены, позволят вам фильтровать ваши сообщения по выбранным вами критериям и возвращать только те сообщения / элементы, которые соответствуют этим критериям.

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

Представьте, что мы создаем веб-сайт с самостоятельным управлением, где каждому post будет вручную назначен post format и автоматически назначен post author

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

Пользовательские Фильтры Постов Все Посты

Несмотря на то, что сообщение будет иметь ссылку с именем автора, возможно, пользователь просто пропустит это (вместе с отображаемым маленьким значком, представляющим тип формата сообщения).

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

Создание выпадающего списка Select с помощью фильтра restrict_manage_posts

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

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

Фильтрация по автору

 //defining the filter that will be used to select posts by 'post formats' function add_post_formats_filter_to_post_administration(){ //execute only on the 'post' content type global $post_type; if($post_type == 'post'){ $post_formats_args = array( 'show_option_all' => 'All Post formats', 'orderby' => 'NAME', 'order' => 'ASC', 'name' => 'post_format_admin_filter', 'taxonomy' => 'post_format' ); //if we have a post format already selected, ensure that its value is set to be selected if(isset($_GET['post_format_admin_filter'])){ $post_formats_args['selected'] = sanitize_text_field($_GET['post_format_admin_filter']); } wp_dropdown_categories($post_formats_args); } } add_action('restrict_manage_posts','add_post_formats_filter_to_post_administration'); 

Давайте рассмотрим этот код, чтобы вы могли понять, что именно мы делаем.

  • Мы создаем функцию и присоединяем ее к действию restrict_manage_posts . Это дает нам доступ к зоне фильтра, показанной в верхней части страницы администрирования сообщений.
  • Мы получаем текущий список типов post_type отображаемый через глобальный post_type . Мы используем это, чтобы определить, находимся ли мы в правильном типе поста (мы хотим выполнить это только для постов, а не для страниц или других типов контента).
  • Мы намереваемся вызвать wp_dropdown_categories WordPress wp_dropdown_categories которая сгенерирует выпадающий список всех форматов wp_dropdown_categories на основе набора критериев. Форматы записей на самом деле являются лишь одной из пользовательских таксономий WordPress (во многом как категории или теги), и поэтому мы можем использовать эту функцию, предоставляя список аргументов.
    • show_option_all — определяет имя, которое будет отображаться, когда мы не хотим что-либо фильтровать (мы используем его, чтобы вы могли отображать «все форматы сообщений» и видеть все ваши форматы сообщений).
    • orderby — это то, как это будет заказано, я решил заказать это по его имени.
    • order — это определяет, каким образом список будет отсортирован, я выбрал по возрастанию.
    • name — это имя самого выпадающего списка. Вам нужно дать этому уникальное имя, чтобы вы могли получить его выбранное значение позже.
    • taxonomy — (это важно) Это значение определяет, какие элементы будут добавлены в список. Поскольку форматы post_format являются просто таксономией, мы можем указать ее название таксономии post_format и он будет собирать термины формата post_format .
  • После того, как мы объявляем наши аргументы для функции wp_dropdown_categories , мы ищем глобальную переменную $_GET чтобы увидеть, действительно ли мы уже выбрали тип пост-формата для фильтрации. Если значение существует, нам нужно добавить новый аргумент в массив аргументов с именем selected который в основном сообщает выпадающему списку, какое значение следует выбрать по умолчанию.

Фильтрация по автору

 //defining the filter that will be used so we can select posts by 'author' function add_author_filter_to_posts_administration(){ //execute only on the 'post' content type global $post_type; if($post_type == 'post'){ //get a listing of all users that are 'author' or above $user_args = array( 'show_option_all' => 'All Users', 'orderby' => 'display_name', 'order' => 'ASC', 'name' => 'aurthor_admin_filter', 'who' => 'authors', 'include_selected' => true ); //determine if we have selected a user to be filtered by already if(isset($_GET['aurthor_admin_filter'])){ //set the selected value to the value of the author $user_args['selected'] = (int)sanitize_text_field($_GET['aurthor_admin_filter']); } //display the users as a drop down wp_dropdown_users($user_args); } } add_action('restrict_manage_posts','add_author_filter_to_posts_administration'); 

Давайте пройдемся по этому коду, чтобы вы могли понять, что именно мы делаем

  • Мы создаем функцию и присоединяем ее к действию restrict_manage_posts . Это даст нам доступ к фильтрам в верхней части экрана администрирования сообщений.
  • Мы используем глобальную переменную post_type чтобы проверить, находимся ли мы в настоящее время на правильном экране администрирования сообщений. Мы только хотим выполнить на posts .
  • Мы хотим использовать функцию wp_dropdown_users для создания списка пользователей на сайте. Нам нужно предоставить следующие аргументы.

    • show_option_all — определяет опцию по умолчанию для списка выбора. В нашем случае мы хотим, чтобы это было «Все пользователи», что означало бы, что мы вообще не хотим ничего фильтровать.
    • orderby — определяет, как будет упорядочен список. Я выбрал заказ только по имени автора.
    • order — определяет, в каком порядке будет упорядочен список, я выбрал порядок по возрастанию.
    • name — имя выпадающего меню, которое будет использоваться позже, когда нам нужно получить выбранное значение, чтобы мы могли фильтровать сообщения.
    • who — определяет, кто будет выбран. Единственное значение, которое мы можем установить, — это authors которые будут выбирать всех пользователей, которые могут создавать сообщения.
    • include_selected — я решил включить это для простоты.
  • После того, как мы объявляем наши аргументы для функции wp_dropdown_users , мы проверяем глобальный $_GET чтобы увидеть, установлено ли у нас значение раскрывающегося wp_dropdown_users . Если это установлено, это означает, что мы уже фильтруем по пользователю, и нам нужно обновить аргументы. Мы устанавливаем значение selected для идентификатора автора, который обеспечивает выбор автора по умолчанию при загрузке страницы.

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

Пользовательские Фильтры Почты Админ

Фильтрация сообщений с использованием фильтра pre_get_posts

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

Мы сделаем это, подключившись к фильтру pre_get_posts .

Фильтр pre_get_posts имеет доступ к текущему query до того, как он будет выполнен WordPress, и позволит нам изменять сообщения, которые будут извлечены из базы данных.

Общая идея заключается в том, чтобы изменить query таким образом, чтобы ограничить количество сообщений, которые будут занесены в административный список. Чтобы сделать это для обоих форматов сообщений и авторов немного отличается, поэтому я разбил каждый метод ниже

Фильтрация по почтовым форматам

 //restrict the posts by the chosen post format function add_post_format_filter_to_posts($query){ global $post_type, $pagenow; //if we are currently on the edit screen of the post type listings if($pagenow == 'edit.php' && $post_type == 'post'){ if(isset($_GET['post_format_admin_filter'])){ //get the desired post format $post_format = sanitize_text_field($_GET['post_format_admin_filter']); //if the post format is not 0 (which means all) if($post_format != 0){ $query->query_vars['tax_query'] = array( array( 'taxonomy' => 'post_format', 'field' => 'ID', 'terms' => array($post_format) ) ); } } } } add_action('pre_get_posts','add_post_format_filter_to_posts'); 

Давайте разберем этот код и выполним то, что мы делаем:

  • Мы создаем функцию с именем add_post_format_filter_to_posts и подключаем ее к фильтру pre_get_posts . Этот фильтр имеет доступ к глобальной переменной query поэтому мы также передаем ее в нашу функцию, чтобы мы могли манипулировать ею. Эта переменная передается по ссылке, поэтому нам не нужно возвращать или выводить какие-либо значения, любые изменения в запросе останутся.
  • Мы получаем глобальные переменные post_type и page_now и проверяем, что page_now равен edit.php а post_type равен post . По сути, мы проверяем, чтобы убедиться, что мы находимся на экране администрирования почты.
  • Мы определяем, был ли выбран формат записи, проверяя переменную $_GET . Если он был установлен, мы собираем его значение.
  • Мы сравниваем выбранное значение, чтобы убедиться, что оно не является нашим значением по умолчанию, равным 0 (значение по умолчанию означает, что оно хочет показывать все форматы записей, что в точности совпадает с отсутствием применения фильтра форматов записей). Пока мы выбрали фильтрацию до определенного формата сообщений, мы создаем и модифицируем объект query чтобы мы могли указывать ему только выбор сообщений, соответствующих выбранному формату сообщений. определенные посты.
  • Мы модифицируем query и изменяем его элемент tax_query чтобы он фильтровал по форматам tax_query . Мы устанавливаем taxonomy post_format , fieldsID а затем $post_format — массив $post_format (который содержит наше значение, по которому мы хотим фильтровать).

Получив этот код, вы сможете отфильтровать свои посты по их формату. Например, вы можете захотеть отфильтровать ваши посты, чтобы показывать только quotes или chats как показано ниже:

Пользовательские фильтры сообщений только в чате

Только пользовательские фильтры

Фильтрация по автору

 //restrict the posts by an additional author filter function add_author_filter_to_posts_query($query){ global $post_type, $pagenow; //if we are currently on the edit screen of the post type listings if($pagenow == 'edit.php' && $post_type == 'post'){ if(isset($_GET['aurthor_admin_filter'])){ //set the query variable for 'author' to the desired value $author_id = sanitize_text_field($_GET['aurthor_admin_filter']); //if the author is not 0 (meaning all) if($author_id != 0){ $query->query_vars['author'] = $author_id; } } } } add_action('pre_get_posts','add_author_filter_to_posts_query'); 

Давайте разберем этот код и выполним то, что мы делаем

  • Мы создаем функцию с именем add_author_filter_to_posts_query и подключаем ее к фильтру pre_get_posts . Этот фильтр имеет доступ к глобальной переменной query поэтому мы также передаем ее в нашу функцию, чтобы мы могли манипулировать ею. Эта переменная передается по ссылке, поэтому нам не нужно возвращать или выводить какие-либо значения, любые изменения в запросе останутся.
  • Мы получаем глобальные переменные post_type и page_now и проверяем, что page_now равен edit.php а post_type равен post . По сути, мы проверяем, чтобы убедиться, что мы находимся на экране после администрации.
  • Мы определяем, был ли выбран формат записи, проверяя переменную $_GET . Если он был установлен, мы собираем его значение.
  • Мы проверяем, чтобы убедиться, что введенное значение не равно 0 как это наше значение по умолчанию. Значение 0 представляет опцию раскрывающегося фильтра «Все авторы», что по сути означает, что наш фильтр ничего не делает. Если наше значение не равно 0 мы обращаемся к query_vas внутри query и устанавливаем значение author для нашего идентификатора. Как только это установлено, он будет тянуть сообщения, принадлежащие только этому идентификатору автора.

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

На моем примере сайта у меня есть два пользователя — admin user и contributor user . Теперь я могу выбрать просмотр сообщений только от выбранного автора, как показано ниже:

Пользовательские фильтры

Пользовательские фильтры только для администратора

В заключение

Теперь, когда вы лучше понимаете административные фильтры WordPress, вы можете использовать это руководство и применить его к своим собственным проектам.

Существует широкий спектр уже предоставленных атрибутов записей, по которым вы можете фильтровать. В этом уроке мы рассмотрели фильтрацию по значению author и таксономии post_format , но вы можете легко фильтровать по другим значениям, таким как значения, перечисленные на справочной странице класса запросов WordPress .