Поиск по произвольным полям в админке Вордпрес. Фильтры

Случай из моей практики. У клиента был организован раздел товаров посредством произвольных записей типа 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 поиск по штрихкоду в админке */

В админке все выглядело так:

Поиск по произвольным полям в wp

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


2022-06-03 | | 5 комментариев | Кодинг | , ,

Рейтинг:

Похожие записи

Почему mb_strimwidth лучше substr

Если загуглить "как обрезать в php обрезать строку по количеству символов", то вероятнее всего вы наткнётесь на рекомендацию использовать для этих целей функцию substr, однако,...

Кейс: Как создать фид для OZON в WooCommerce

При помощи плагина YML for Yandex Market можно создавать фиды не только для Яндекса, но и для других маркетплейсов. В этом кейсе разберём создание фида...

W3TC Page Cache мешает созданию фида (решение)

Эта инструкция актуальна для плагинов: YML for Yandex Market; XML for Google Merchant Center; XML for Avito. XML for Hotline; XML for O.Yandex (Яндекс Объявления);...

Комментарии к посту «Поиск по произвольным полям в админке Вордпрес. Фильтры»

avatar

Andrey - 23:03

Очень и очень полезная информация!! Спасибо! Очень помогли!!!

    avatar

    Глазунов - 23:16

    Рад, что смог помочь!

avatar

Sergey - 17:19

Спасибо, все работает! Два дня искал решение, ничего рабочего на эту тему не мог найти в интернете, пока к вам не попал. Просто супер.

avatar

Ксения - 01:00

Хотелось бы уточнить, а можно по конкретному параметру отфильтровать в виде выпадающего списка?

    avatar

    Максим - 11:51

    Да. Можно. Нужно будет редактировать строку

    <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"></code>

    Именно тут вам нужно будет вставить свой select. Будет типа такого:

    <?php if (isset($_GET['meta_filter'])) {$meta_filter = sanitize_text_field($_GET['meta_filter']);} else {$meta_filter = '';} ?>
    <select name="meta_filter" id="filter-by-field">
    	<option value="значение1" <?php selected($meta_filter, 'значение1'); ?>>Описание значения 1</option>
    	<option value="значение2" <?php selected($meta_filter, 'значение2'); ?>>Описание значения 2</option>
    </select>

Добавить комментарий

Ваш адрес email не будет опубликован.