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

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

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

Рейтинг: 5

2022-07-01 / / 8 комментариев / Про кодинг и сервер / , ,