@stoik_kpd

Как указать тип произвольной записи в фильтре?

Доброго времени суток!
Пользовался таким фильтром, который исправно работал со стандартными постам. Но мне понадобилось зарегистрировать новый произвольный тип записей(код по которому регистрировал ниже). Создал страницу и выбрал шаблон с таким кодом фильтра(который работал со стандартными постами, однако он не хочет фильтровать записи из новой произвольной записи. Ничего не происходит. Подскажите пожалуйста, как правильно указать тип произвольной записи. Произвольные поля добавил для новых типов записи с помощью плагина advanced custom fields):
<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);
}
  • Вопрос задан
  • 191 просмотр
Решения вопроса 1
Punkie
@Punkie
Соблюдая ваш принцип построения $args выйдет примерно так:
if (!empty($_GET['video'])) { // если передан массив с фильтром по комнатам
        $args['meta_query'][] = array( // пешем условия в meta_query
            'key' => 'разрешение_видеосъемки', // название произвольного поля
            'value' => $_GET['video'], // содержит массив со значениями отмеченных чекбоксов
            'type' => 'numeric', // тип поля - число
            'compare' => 'IN' // тип сравнения IN, т.е. значения поля комнат должно быть одним из значений элементов массива
            );
        $args['post_type'][] => array( 'models' );
}


Или так (не уверен на 100%, нужно пробовать):

if (!empty($_GET['video'])) { // если передан массив с фильтром по комнатам
        $args['meta_query'][] = array( // пешем условия в meta_query
            'key' => 'разрешение_видеосъемки', // название произвольного поля
            'value' => $_GET['video'], // содержит массив со значениями отмеченных чекбоксов
            'type' => 'numeric', // тип поля - число
            'compare' => 'IN' // тип сравнения IN, т.е. значения поля комнат должно быть одним из значений элементов массива
            );
        $args['post_type'] => array( 'models' );
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы