L
L
Laid2016-02-26 11:01:55
WordPress
Laid, 2016-02-26 11:01:55

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 с новым массивом переданным из формы и фильтруем
} ?>

Record Type Registration Code = Models
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

1 answer(s)
M
Mr Crabbz, 2016-02-26
@stoik_kpd

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' );
}

Or like this (not 100% sure, you need to try):
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 question

Ask a Question

731 491 924 answers to any question