Answer the question
In order to leave comments, you need to log in
How to specify the type of an arbitrary record in a filter?
Good day!
I used such a filter that worked properly with standard posts. But I needed to register a new custom post type (the code for which I registered below). I created a page and chose a template with the following filter code (which worked with standard posts, but it does not want to filter posts from a new custom post. Nothing happens. Please tell me how to correctly specify the type of custom post. Added custom fields for new post types using advanced custom fields plugin):
<form class="filter" action="" method="get"><!-- action пустой, чтобы ссылалось на текущую страницу -->
<span class="textfiltr"><label>Максимальная высота полёта:</span>
<span class="poleta">
<select name="razdel"> <!-- Раздел - селектлист -->
<option value="">Неважно</option>
<option value="15">15м</option>
<option value="22">22м</option>
<option value="100">100м</option>
<option value="122">122м</option>
<option value="190">190м</option>
<option value="500">500м</option>
<option value="700">700м</option>
<option value="1000">1000м</option>
<option value="4500">4500м</option>
<option value="6000">6000м</option>
</select>
</span>
</label>
<span class="textfiltr"><label>Количество винтов:</span>
<span class="poleta"> <select name="vinty"> <!-- Раздел - селектлист -->
<option value="">Неважно</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="6">6</option>
<option value="8">8</option>
</select></span>
</label>
<span class="textfiltr"><label>Камера: </span>
<span class="poleta"><select name="kamera"> <!-- Раздел - селектлист -->
<option value="">Неважно</option>
<option value="внешняя в комплекте">Внешняя в комплекте</option>
<option value="внешняя опциональная">Внешняя опциональная</option>
<option value="встроена в корпус">Встроена в корпус</option>
<option value="не поддерживается">Не поддерживается</option>
</select>
</label></span>
<span class="textfiltr"><label>Дистанционное управление камерой: </span>
<span class="poleta"> <select name="upr-kamera"> <!-- Раздел - селектлист -->
<option value="">Неважно</option>
<option value="две оси">Две оси</option>
<option value="три оси">Три оси</option>
<option value="отсутствует">Отсутствует</option>
</select>
</label>
</span>
<span class="textfiltr"><label>Поддержка карт памяти: </span>
<span class="poleta"> <select name="karta"> <!-- Раздел - селектлист -->
<option value="">Неважно</option>
<option value="да">Да</option>
<option value="нет">Нет</option>
</select>
</label></span>
<span class="textfiltr"> Разрешение видеосъёмки:</span>
<span class="checboxs"><label>480р<input type="checkbox" name="video[]" value="480"/></label>
<label>720p<input type="checkbox" name="video[]" value="720"/></label></span>
<span class="checboxs2"> <label>1080p<input type="checkbox" name="video[]" value="1080"/></label>
<label>2160p<input type="checkbox" name="video[]" value="2160"/></label></span>
<!-- Чекбоксы для разрешение видеосъёмки -->
<span class="textfiltr"><label>Цена:</span>
<span class="poleta2">от:<!-- Интервал значений цены -->
<input type="number" name="price_ot"/>
</label></span>
<span class="poleta3"><label>до:
<input type="number" name="price_do"/>
</label></span>
<span class="knopka"><p><button type="submit">Отфильтровать</button></p></span>
</form>
</div>
<?php if ($_GET && !empty($_GET)) { // наша функция
$args = array(); // подготовим массив
$args['meta_query'] = array('relation' => 'AND'); // отношение между условиями, у нас это "И то И это", можно ИЛИ(OR)
$args['tax_query'] = array('relation' => 'AND'); // можно OR
global $wp_query; // нужно заглобалить текущую выборку постов
if ($_GET['proiz'] != '') {
$args['tax_query'][] = array(
'taxonomy' => 'proizvoditel', // слаг таксономии
'field' => 'id', // по полю slug
'terms' => $_GET['proiz'], // слаг термина
);}
if ($_GET['razdel'] != '') { // если передана фильтрация по разделу
$args['meta_query'][] = array( // пешем условия в meta_query
'key' => 'максимальная_высота', // название произвольного поля
'value' => (int)$_GET['razdel'], // переданное значение произвольного поля
'type' => 'numeric' // тип поля, нужно указывать чтобы быстрее работало, у нас здесь число
);
}
if (!empty($_GET['kamera'])) { // если передан массив с фильтром по комнатам
$args['meta_query'][] = array( // пешем условия в meta_query
'key' => 'камера', // название произвольного поля
'value' => $_GET['kamera'], // содержит массив со значениями отмеченных чекбоксов
'compare' => '=' // тип сравнения IN, т.е. значения поля комнат должно быть одним из значений элементов массива
);
}
if (!empty($_GET['upr-kamera'])) { // если передан массив с фильтром по комнатам
$args['meta_query'][] = array( // пешем условия в meta_query
'key' => 'дистанционное_управление_положением_камеры', // название произвольного поля
'value' => $_GET['upr-kamera'], // содержит массив со значениями отмеченных чекбоксов
'compare' => '=' // тип сравнения IN, т.е. значения поля комнат должно быть одним из значений элементов массива
);
}
if (!empty($_GET['vinty'])) { // если передан массив с фильтром по комнатам
$args['meta_query'][] = array( // пешем условия в meta_query
'key' => 'kolichestvo_vintov', // название произвольного поля
'value' => $_GET['vinty'], // содержит массив со значениями отмеченных чекбоксов
'compare' => '=' // тип сравнения IN, т.е. значения поля комнат должно быть одним из значений элементов массива
);
}
if (!empty($_GET['karta'])) { // если передан массив с фильтром по комнатам
$args['meta_query'][] = array( // пешем условия в meta_query
'key' => 'поддержка_карт_памяти', // название произвольного поля
'value' => $_GET['karta'], // содержит массив со значениями отмеченных чекбоксов
'compare' => '=' // тип сравнения IN, т.е. значения поля комнат должно быть одним из значений элементов массива
);
}
if ($_GET['price_ot'] != '' || $_GET['price_do'] != '') { // если передано поле "Цена от" или "Цена до"
if ($_GET['price_ot'] == '') $_GET['price_ot'] = 0; // если "Цена от" пустое, то значит от 0 и выше
if ($_GET['price_do'] == '') $_GET['price_do'] = 9999999; // если "Цена до" пустое, то будет до 9999999
$args['meta_query'][] = array( // пешем условия в meta_query
'key' => 'sred_price', // название произвольного поля
'value' => array( (int)$_GET['price_ot'], (int)$_GET['price_do'] ), // переданные значения ОТ и ДО для интервала передаются в массиве
'type' => 'numeric', // тип поля - число
'compare' => 'BETWEEN' // тип сравнения, здесь это BETWEEN - т.е. между "Цены от" и до "Цены до"
);
}
if (!empty($_GET['video'])) { // если передан массив с фильтром по комнатам
$args['meta_query'][] = array( // пешем условия в meta_query
'key' => 'разрешение_видеосъемки', // название произвольного поля
'value' => $_GET['video'], // содержит массив со значениями отмеченных чекбоксов
'type' => 'numeric', // тип поля - число
'compare' => 'IN' // тип сравнения IN, т.е. значения поля комнат должно быть одним из значений элементов массива
);
}
query_posts(array_merge($args,$wp_query->query)); // сшиваем текущие условия выборки стандартного цикла wp с новым массивом переданным из формы и фильтруем
} ?>
add_action( 'init', 'argen_models_init' ); // Использовать функцию только внутри хука init
function argen_models_init() {
$labels = array(
'name' => 'Модели',
'singular_name' => 'модель', // админ панель Добавить->Функцию
'add_new' => 'Добавить модель',
'add_new_item' => 'Добавить новую модель', // заголовок тега <title>
'edit_item' => 'Редактировать модель',
'new_item' => 'Новая модель',
'all_items' => 'Все модели',
'view_item' => 'Просмотр карточки модели на сайте',
'search_items' => 'Искать модель',
'not_found' => 'модель не найдена.',
'not_found_in_trash' => 'В корзине нет моделей.',
'menu_name' => 'Модели' // ссылка в меню в админке
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => array( 'slug' => 'каталог' ),
'capability_type' => 'post',
'has_archive' => true,
'hierarchical' => false,
'menu_position' => 5,
'supports' => array('title','editor','revisions','custom-fields','author','thumbnail','excerpt','comments'));
register_post_type('models', $args);
}
Answer the question
In order to leave comments, you need to log in
Following your construction principle, $args will come out something like this:
if (!empty($_GET['video'])) { // если передан массив с фильтром по комнатам
$args['meta_query'][] = array( // пешем условия в meta_query
'key' => 'разрешение_видеосъемки', // название произвольного поля
'value' => $_GET['video'], // содержит массив со значениями отмеченных чекбоксов
'type' => 'numeric', // тип поля - число
'compare' => 'IN' // тип сравнения IN, т.е. значения поля комнат должно быть одним из значений элементов массива
);
$args['post_type'][] => array( 'models' );
}
if (!empty($_GET['video'])) { // если передан массив с фильтром по комнатам
$args['meta_query'][] = array( // пешем условия в meta_query
'key' => 'разрешение_видеосъемки', // название произвольного поля
'value' => $_GET['video'], // содержит массив со значениями отмеченных чекбоксов
'type' => 'numeric', // тип поля - число
'compare' => 'IN' // тип сравнения IN, т.е. значения поля комнат должно быть одним из значений элементов массива
);
$args['post_type'] => array( 'models' );
}
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question