1. Регистрируете гет-переменные
add_filter( 'query_vars', 'add_query_vars' );
function add_query_vars( $qvars ) {
$qvars[] = 'brand';
$qvars[] = 'model';
$qvars[] = 'price';
$qvars[] = 'location';
return $qvars;
}
2. Собираете и выводите html-форму
<form method="get" class="block obj-filter">
<div class="row d-flex align-items-center">
<div class="col-12 col-md-6 col-lg-3 col-margin-bottom-small col-lg-margin-bottom-none">
<select name="brand" id="brand" class="obj-select">
<option value="audi">Audi</option>
<option value="volkswagen">Volkswagen</option>
<option value="mercedes">Mercedes</option>
<option value="bmw">BMW</option>
</select>
</div>
<div class="col-12 col-md-6 col-lg-3 col-margin-bottom-small col-lg-margin-bottom-none">
<select name="price" id="price" class="obj-select">
<option value="20">$20 000</option>
<option value="50">$50 000</option>
<option value="75">$75 000</option>
<option value="100">$100 000</option>
</select>
</div>
<div class="col-12 col-md-6 col-lg-3 col-margin-bottom-small col-lg-margin-bottom-none">
<input type="text" name="location" id="location" class="obj-filter-input" value="">
</div>
<div class="col-12 col-md-6 col-lg-3 col-margin-bottom-small col-lg-margin-bottom-none">
<input id="obj-filter-submit" type="submit" class="button" value="Фильтровать">
</div>
</div>
</form>
3. При нажатии кнопки
Фильтровать страница перезагружается, вы получаете ссылку вида
https://example.loc/?brand=audi&price=50
. На хуке
pre_get_posts
можно поправить основной запрос вытянув данные из гет-параметров. Вам нужно установить новые
tax_query или
meta_query в зависимости от логики сайта
add_action( 'pre_get_posts', 'custom_pre_get_posts', 1 );
function custom_pre_get_posts( $query ) {
// Выходим, если это админ-панель или не основной запрос
if( is_admin() || ! $query->is_main_query() )
return;
// предположим, что это таксономия с машинами
if ( $query->is_tax( 'cars' ) ) {
$meta = array();
$meta['meta_query']['relation'] = 'AND';
// выбираем записи с GET запросами
$query_vars = ['brand', 'model', 'price', 'location'];
foreach ( $query_vars as $key => $query_var ) {
if ( $var = get_query_var( $query_var, false ) ) {
// тут пишем логику по которой собирается переменная meta_query и/или tax_query
}
}
$query->set( 'meta_query', $meta );
}
}