Выведя дополнительные столбцы в админке, хотелось бы иметь возможность фильтрации по этим полям. Как это делать, покажу на примере фильтрации по мета-полю публикации.
Если вы читаете данный гайд, то уже знаете :
- Как добавить кастомный тип публикации в WP.
- Как вывести дополнительные столбцы в списке публикации WP в админке.
Если нет, восполните сначала данные пробелы, чтобы двигаться дальше.
Итак, мы создали свой кастомный тип публикации, в котором храним описания филиалов нашей розничной сети. При регистрации данного типа материала (filials), я указал, что буду использовать meta-поля (custom_fields).
WordPress позволяет прямо в редакторе публикации создавать новые поля, подключая их к редактируемой статье. Я решил, что буду задавать для каждого филиала поле City, т.е. город, где расположен данный филиал. Соотвествующий столбец был настроен в списке публикаций админки WP.
Для внедрения фильтра понадобится две зацепки :
- Фильтр (filter) parse_query — позволяет добавить HTML код в панель фильтров админки,
- Действие (action) restrict_manage_posts — позволяет внедриться в запрос списка выводимых записей и сделать нужные нам манипуляции.
Реализацию этих зацепок нужно разместить в function.php своей темы или коде своего плагина.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
// кастомный фильтр в список публикаций админки add_filter( 'parse_query', 'admin_posts_filter' ); add_action( 'restrict_manage_posts', 'admin_posts_filter_restrict_manage_posts' ); function admin_posts_filter( $query ) { global $pagenow; if ( is_admin() && $pagenow=='edit.php') { //добавлям фильтрацию по городу в запрос if (!empty($_GET['ADMIN_FILTER_FIELD_CITY'])) { $query->query_vars['meta_key'] = 'City'; $query->query_vars['meta_value'] = $_GET['ADMIN_FILTER_FIELD_CITY']; } } } function admin_posts_filter_restrict_manage_posts() { global $wpdb, $pagenow; if ($pagenow != 'edit.php') return; $out = ''; switch ($_GET['post_type']) { case 'filials': //фильтр по городу $fieldname = 'ADMIN_FILTER_FIELD_CITY'; //надо выбрать все уникальные значения поля для показа //в выпадающем поле $rows = $wpdb->get_results("SELECT DISTINCT meta_value FROM {$wpdb->postmeta} WHERE meta_key = 'City' ORDER BY meta_value", ARRAY_N); //собираем HTML код SELECT со списком городов $out .= '<select name="' . $fieldname . '"> <option value="">-- Выберите город --</option>'; foreach($rows as $row) { if (isset($_GET[$fieldname]) && $_GET[$fieldname] == $row[0]) $out .= sprintf ('<option value="%s" selected>%s</option>', $row[0], $row[0]); else $out .= sprintf ('<option value="%s">%s</option>', $row[0], $row[0]); } $out .= '</select>'; } //покажем созданный фильтр echo $out; } |
У вас будут свои мета-поля, но данный каркас вы легко приспособите для собственной задачи.
А если нужно N-фильтров и все они являются кастомными полями?
$query->query_vars[‘meta_key’] = ‘City’;
$query->query_vars[‘meta_value’] = $_GET[‘ADMIN_FILTER_FIELD_CITY’];
Как в query_vars передать несколько мета-данных. Я это пойму конечно через время (доки почитаю, погуглю), просто наверняка и другим будет это интересно
Или можно как-то массив передать?
Можно и массив передавать, если нужно:) К примеру, вы создаёте select с множественным выбором и именем переменной myvar[]. При выборе нескольких элементов списка получите массив в $_GET[‘myvar’].
WP_query позволяет собирать несколько условий https://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters
для этого нужно собрать массив вида
Ответ тут:
https://wp-kama.ru/function/wp_meta_query