Случай из моей практики. У клиента был организован раздел товаров посредством произвольных записей типа post (post_type=product). У этих записей имелись произвольные поля barcode и barcode2, содержащие штрихкод. Необходимо было организовать поиск по артикулу внутри админки Вордпрес.
Реализовано было так (код для function.php):
/* поиск по штрихкоду в админке */
add_action('restrict_manage_posts','custom_filter_for_posts_html');
function custom_filter_for_posts_html() { /* это функция которая отображает сам фильтр */ ?>
<style>
input[type='number'] {-moz-appearance:textfield;}
input::-webkit-outer-spin-button, input::-webkit-inner-spin-button {-webkit-appearance: none;}
</style>
<label for="filter-by-field" class="screen-reader-text">Штрихкод</label>
<input placeholder="Штрихкод" type="number" value="<?php if (isset($_GET['meta_filter'])) {echo sanitize_text_field($_GET['meta_filter']);} ?>" name="meta_filter" id="filter-by-field">
<?php
}
add_filter('request','custom_filter_for_posts');
function custom_filter_for_posts($vars) {
// функция custom_filter_for_posts обрабатывает запрос и фильтрует данные
// $vars - это стандартные параметры запроса WP. Типа как у функции get_posts
// в итоге мы дописываем только то что нам нужно, не изменяя тех значений которые нам не нужны
global $pagenow;
global $post_type;
// тут нужно указать все типы постов где нужен этот фильтр, например 'page','product' и т.д.
$start_in_post_types=array('product');
if( !empty($pagenow) && $pagenow=='edit.php' && in_array($post_type , $start_in_post_types)) {
$contents = (string)sanitize_text_field($_GET['meta_filter']);
if (!empty($_GET['meta_filter'])){
$vars['meta_query'] = array(
"relation"=>'OR',
array(
"key"=>"barcode", // ключ 1-го произвольного поля по которому идет поиск
"value"=> $contents,
'type' => 'char',
'compare' => 'LIKE'
),
array(
'key' => 'barcode2', // ключ 2-го произвольного поля по которому идет поиск
'value' => $contents,
'type' => 'char',
'compare' => 'LIKE'
)
);
}
}
return $vars;
}
/* end поиск по штрихкоду в админке */
В админке все выглядело так:

Разумеется, что аналогичным способом вы можете создавать свои фильтры, причем они не обязательно должны быть текстовыми как в моем случае.
Andrey - 23:03
Очень и очень полезная информация!! Спасибо! Очень помогли!!!
Глазунов - 23:16
Рад, что смог помочь!
Sergey - 17:19
Спасибо, все работает! Два дня искал решение, ничего рабочего на эту тему не мог найти в интернете, пока к вам не попал. Просто супер.
Ксения - 01:00
Хотелось бы уточнить, а можно по конкретному параметру отфильтровать в виде выпадающего списка?
Максим - 11:51
Да. Можно. Нужно будет редактировать строку
Именно тут вам нужно будет вставить свой select. Будет типа такого:
Владимир - 08:37
А как вместо текстового поля сделать выпадающий список?
Максим - 18:12
В целом, в коде, который в примере нужно изменить строку с input на строку с select.
Вариантов тут гораздо больше хотя бы потому, что значения для селекта можно хранить и получать по разному. Как и извлекать. Можно из массива, можно, если их мало, задать фиксированно.
Код ниже не является прям рабочим из коробки и создан лишь для описания самой идеи:
Feel - 10:21
Пригодилось. +10 в программистскую карму автору. Это лучше (кстати и проще, и логичнее, и понятнее для пользователя), чем настраивать поле Поиска, которое должно искать только по заголовку и содержимому.