Приветствую!
В нашей предыдущей статье мы рассмотрели возможность построения get-запроса к базе данных Worpress и рассмотрели варианты использования этой возможности для формирования фильтра записей, страниц и тд. Как вы помните в прошлой статье нам удалось избежать процесса создания скрипта-обработчика данных с формы и мы целиком возложили этот процесс на сам WordPress, ограничившись только построением правильного запроса через форму фильтра. Но как мы выяснили, этот способ имеет один существенный недостаток - невозможность поиска по произвольным полям этих страниц или записей.
Сегодня мы попробуем пойти другим путем и научимся формировать фильтры с использованием произвольных полей.
Скажу сразу, чтобы хотя мы и будем полагаться на функциональные возможности WordPress по выборке и поиску у нас все же не получиться обойтись без необходимости написания своего скрипта обрабатывающего запрос с формы фильтра для получения нужного результата.
Итак, начнем подготовку к реализации нашего фильтра.
Для начала подготовим шаблон страницы, где и будет происходить вывод результатов выборки.
Для этого в админке нашего сайта создадим новую пустую страницу, назовем ее "Результаты поиска" и назначим ей URL "customsearch"
Далее связываемся с нашим сервером с помощью FTP-клиента, находим файл page.php, делаем с него копию и переименовываем в page-customsearch.php. Таким образом, мы сообщаем, что все обращения к нашей созданной в админке странице будут обрабатываться именно в этом файле, не затрагивая другие, а обращаться мы к ней будем через наш фильтр записей.
После этого, мы можем приступать к формированию HTML-кода нашего фильтра. Основные принципы построения фильтра описаны в предыдущей статье, поэтому я приведу пример формы фильтра, описав подробно только моменты связанные с использованием произвольных полей в этой форме:
<form action="/customsearch/" method="get"> //выборка по отдельному слову <p><label>Поисковый запрос</label><br /> <input type="text" name="word" value=""></p> //выборка по терминам определенной таксономии, в нашем случае prodcat <p><label>Укажите товарную категорию:</label><br /> <select name="prodcat"> <option value="">--------</option> <option value="148">Плагины WordPress</option> <option value="199">Изображения</option> </select> </p> //Выборка по значениям цены, которые указаны произвольными полями <p><label>Диапазон цены</label><br /> от <input type="text" name="min-price" size="3" value=""> до <input type="text" name="max-price" size="3" value=""></p> //Указание сортировки результатов выборки //Тут мы можем отсортировать и по значению цены, заданного //произвольным полем <p><label>Сортировка по</label><br /> <select name="orderby"> <option value="date">дате добавления</option> <option value="title">заголовку</option> <option value="meta_value_num">цене</option> </select> </p> //Указание направление результатов сортировки <p><label>Направление сортировки:</label><br /> <input type="radio" name="order" value="DESC"> по убыванию<br /> <input type="radio" name="order" value="ASC"> по возрастанию </p> //Указание количества записей на одну страницу <p><label>Получить:</label><br /> <select name="num"> <option value="-1">Все товары</option> <option value="2">2 товара</option> <option value="4">4 товара</option> <option value="6">6 товаров</option> </select> </p> <p><input type="submit" value="Получить товары"></p> //так как мы можем производить сортировку и по произвольным полям, то //в запросе следует указывать ключ этого поля. //В нашем случае это цена товара "price-products" <input type="hidden" name="meta_key" value="price-products"> </form>
Обратите внимание на атрибут action тега form, в нем мы указываем адрес именно той страницы, которую создали в админке и для которой мы создали отдельный шаблон на сервере. Метод передачи данных мы можем использовать любой, POST или GET.
Собственно, когда мы имеем на руках код формы мы можем переходить к этапу обработки данных, передаваемых этой формой. Здесь следует отметить, что нам не придется писать какой то большой скрипт, мы лишь будем максимально использовать возможности WordPress по обоработке переданных с формы данных. Поэтому мы ограничимся лишь построением массива данных, который затем передадим в цикл WordPress для вывода результата.
Обратимся к стандартной функции query_posts(), именно в эту функцию мы и должны передать сформированный нами массив. Эта функция распологается перед началом цикла записей и влияет на него, заставляя его выводить именно те записи, которые нам нужны и в том порядке который мы указали, лишь получив сформированный массив.
Как же формировать этот массив? Для этого мы можем обратиться к обширному описанию этой функции в кодексе Worpress. Это описание я дублировать тут не буду, но постараюсь подробно описать логику построения массива данных именно для нашей формы.
Итак, перейдем к построению массива данных для функции query_posts(). Для этого мы должны открыть для редактирования созданный нами ранее файл page-customsearch.php, где и будет происходить обработка и вывод результатов обработки нашего запроса.
Находим в нем начало цикла, которое выглядит примерно так:
if (have_posts()) : while (have_posts()) : the_post();
и ставим перед этой строкой функцию query_posts() и заготовку для нашего массива. Должно получиться примерно следующее:
<?php $args = array( ); query_posts( $args ); ?> <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
Теперь основываясь на описание функции query_posts в кодексе, данные которые форма передает и метод передачи этих данных начинаем наполнение массива. Смотрим на нашу форму и идем по порядку:
$args = array( //Для начала укажем тип записей по которым осуществляем поиск //В нашем случае это products 'post_type' => 'products', //Передадим поисковый запрос из первого текстового поля 's' => $_GET['word'], //Тут передаем ключ произвольного поля по которому осуществляем //сортировку, если сортировка идет по произвольному полю 'meta_key' => $_GET['meta_key'], //Здесь передаем количество записей выводимых на одной странице 'posts_per_page' => $_GET['num'], // "-1" - получаем все //Эти данные нужны для правильной работы постраничной навигации //в результатах поиска 'paged' => get_query_var( 'paged' ), //Тут передаем направление сортировки, указанное пользователем 'order' => $_GET['order'], //DESC,ASC //Здесь указываем по чему именно производим сортировку 'orderby' => $_GET['orderby'], //title, ID, author, name, date, meta_value //В этом параметре передаем идентификатор термина таксономии prodcat, в котором ищем //записи. Ограничиваем область поиска в пределах одного пользовательского термина 'tax_query' => array( array( 'taxonomy' => 'prodcat', 'field' => 'id', 'terms' => array($_GET['prodcat']) ) ), //Здесь передаем минимальную и максимальную цены в диапазоне которых производим поиск. //т.е. осуществляем поиск в пределах значений определенного произвольного поля. //В нашем случае 'price-products' 'meta_query' => array( array( 'key' => 'price-products', 'value' => array( $_GET['min-price'], $_GET['max-price'] ), 'type' => 'numeric', 'compare' => 'BETWEEN' ) ) );
Остановлюсь более подробно на указании значений произвольного поля в этом массиве. В нашем случае, мы указали диапазон значений цены "от и до", поэтому значение параметра compare мы установили, согласно документации к функции, как BETWEEN, что означает, что выборку будем делать в диапазоне значений. Но поиск по произвольным полям может быть очень разнообразным и в зависимости от нужного нам результата будет менять и порядок формирования этих значений в массиве функции query_posts.
Например, для поиска записей только по определенному значению произвольных полей или ключу произвольного поля, достаточно будет указать в массиве:
//Ищем по ключу произвольного поля 'meta_key'=>'color' //или только по значению 'meta_value'=>'green' //Если ищем и по значению и по ключу, то выглядит так 'meta_key'=>'color', 'meta_value'=>'green'
А для поиска уже нескольким произвольным полям придется использовать параметр meta_query, который мы использовали в нашем примере
'meta_query' => array( //здесь мы указали что производим поиск по произвольным полям //с ключом color, значения которых не равны blue array( 'key' => 'color', 'value' => 'blue', 'compare' => 'NOT LIKE' ), //тут мы указали диапазон значений произвольного поля price, //в котором производим поиск //type - параметр уточняющий тип передаваемых данных array( 'key' => 'price', 'value' => array( 20, 100 ), 'type' => 'numeric', 'compare' => 'BETWEEN' ) )
Следует отметить, что параметр compare - определяет сравнение и может быть: =, !=, >, >=, <, <=, LIKE, NOT LIKE, IN, NOT IN, BETWEEN, NOT BETWEEN. По умолчанию =;
Итак, после более подробного экскурса в принципы построения массива при использовании в них произвольных полей, вернемся к нашему примеру формы фильтра.
Разместив код сформированного массива в наш файл page-customsearch.php, мы получаем примерно такой конечный код:
<?php /*Выше распологается какой то код*/ /*********************************/ $args = array( 'post_type' => 'products', 's' => $_GET['word'], 'meta_key' => $_GET['meta_key'], 'posts_per_page' => $_GET['num'], 'paged' => get_query_var( 'paged' ), 'order' => $_GET['order'], 'orderby' => $_GET['orderby'], 'tax_query' => array( array( 'taxonomy' => 'prodcat', 'field' => 'id', 'terms' => array($_GET['prodcat']) ) ), 'meta_query' => array( array( 'key' => 'price-products', 'value' => array( (int)$_GET['min-price'], (int)$_GET['max-price'] ), 'type' => 'numeric', 'compare' => 'BETWEEN' ) ) ); query_posts( $args ); ?> <?php if (have_posts()) : while (have_posts()) : the_post(); ?> /*********************************/ /*Ниже распологается какой то код*/
Получилось очень коротко и понятнее, чем если бы вам кто то писал функцию обработчик данных с вашей формы не используя возможности функции query_posts.
И теперь отправив запрос из нашей формы в этот файл, мы получим результат в виде списка записей который подходят под условия выборки указанные в фильтры.
Нам осталось лишь облагородить нашу форму с помощью CSS и разместить ее в любом месте нашего шаблона.
#customsearch{ width:250px; margin:15px auto; border:1px solid #ccc; border-radius:10px; padding:10px; } #customsearch label{ font-weight:bold; display:block; } #customsearch input[type="text"], #customsearch input[type="submit"], #customsearch select{ padding:5px; border:1px solid #ccc; border-radius:5px; }
А если закрепить за ней какой то шорткод, то использовать ее станет еще проще.
Фактически в результате мы получили форму поиска по этому сайту по товарам.
Рабочий пример распологаю прямо тут:
Подобным образом можно создавать разнообразные формы своими руками без всякого лишнего и левого кода, полагаясь только на функционал WordPress, просто грамотно используя лишь одну функцию.
Отличное и простое решение! Возьму на заметку.
А page-customsearch.php - можно же и id страницы указать? page-6983.php - я так понимаю тоже подцепит эту страницу? И - передаст в неё запрос?
У меня чпу не включено было изначально. Теперь, когда записей больше 4000 я боюсь их включать - много где придется поправлять в коде. И фиг знает как поисковики отнесутся - будет же 2 адреса - короткие и чпу.
да, совершенно верно, при создании шаблона страницы можно использовать и ее идентификатор, но я не стал усложнять описание всеми возможными вариантами и способами реализации, для новичков и этого будет достаточно, а профи и сами поймут, чем можно дополнить) Сосредоточился на сути, думаю передать ее получилось.
Кстати, используя принцип построения фильтра-поиска в этой статье, я построил фильтр по заданиям в скрипте фриланс-биржи http://birzha.codeseller.ru/orders/
Круто, а как сделать поиск по полям профиля?
за место формы поиска отображается ошибка Parse error: syntax error, unexpected $end in /home/...page-customsearch.php on line 83 при удалении из кода сама форма отображается, что то сделал не правильно?
текст ошибки сообщает о наличии ошибки синтаксиса PHP на 83 строке вашего шаблона. Скорее всего где то не закрыта фигурная скобка или отсутствует точка с запятой в конце строки. Проверьте код внимательнее.
спасибо!
Огромное спасибо за статью, это мега круто)
У меня проблема, ломаю мозг уже неделю, может кто поможет:
У товара есть две цены (запись должна быть обязательно одна). В общем, есть товар "Гранит номер 1" и у него две цены: Толщина 30мм - цена 500 грн/м2; Толщина 20мм - цена 400 грн/м2;
"Толщина 30мм и 20мм" - это теги (метки), "Гранит номер 1" - это запись, принадлежит рубрике "Каталог гранита", ну и цена для тега 20мм это произвольное поле "price", а цена тега 30мм это произвольное поле "cena".
Огромная просьба, если кто знает поделитесь, как сделать в данном примере, чтобы, когда человек выбирает тег 20мм, то опция "Цена от и до" искала по одному произвольному полю, а если выбран тег 30мм, то опция "Цена от и до" искала по другому произвольному полю?
Спасибо!
Перед формированием массива для query_posts проверяйте через if что у вас пришло в значении $_GET['толщина'], если 20мм, то $meta_key = 'price' иначе $meta_key = 'cena' и уже в массив подставляйте переменную $meta_key для meta_query как значение key.
О боже, как это просто оказалось 🙂
Огромное спасибо за помощь!
А вы не можете объяснить поиск по поисковой фразе, у вас это" 's' => $_GET['word']," просто что бы я не вводил у меня ни чего не получается. Запрос не выдается я даже чуть функцию прописал которая форматирует массив но все равно не находит вот какой массив получается
Array (
[post_type] => post
[s] => Дуб
[paged] => 0
[posts_per_page] => -1
[meta_query] => Array (
[0] => Array (
[key] => price-products
[value] => Array (
[0] => 140
[1] => 210 )
[type] => numeric
[compare] => BETWEEN
)
)
) но по слуву дуб ни чего не находит может я просто не понимаю алгоритм поиска?
в общем массив составлен верно. Вы пытаетесь искать среди постов содержащих произвольное поле price-products со значением от 140 до 210. Вы уверены, что среди постов имеющих значение произвольного поля в указанном диапазоне имеется искомое слово в тексте или заголовке?
Да стоит
полная фраза Декор:Дуб ну я так тоже ставил
и даже если я не ставлю поисковой запрос 140-210 все равно не находит
И ещё вопрос вот в этом скрипте
'tax_query' => array(
array(
'taxonomy' => 'prodcat',
'field' => 'id',
'terms' => array($_GET['prodcat'])
)
),
можно пользоваться не селектом, а чекбоксом.
если сделать так: query_posts( array('s'=>'Дуб') ); поиск производится? Это слово должно находится либо в заголовке, либо в контенте.
Для tax_query можно пользоваться чекбоксом, но тогда следует учитывать, что значений может быть несколько и они должны вноситься в массив ‘terms’ => array() через запятую. Как вы будете это делать зависит уже от вас.
Я понял в чем дело почему не искало просто даже если параметр передаещь пустой он участвует в поиске как 0 поэтому пришлось сделать так:
$valueMinQ= $_GET['min-price'];
$valueMaxQ=$_GET['max-price'];
if(!$valueMaxQ){
$args = array(
'post_type' => 'post',
's' => $_GET['word'],
'paged' => get_query_var( 'paged' ),
'posts_per_page' => -1,);
}else{
$args = array(
'post_type' => 'post',
's' => $_GET['word'],
'paged' => get_query_var( 'paged' ),
'posts_per_page' => -1,
'meta_query' => array(
array(
'key' => 'price-products',
'value' => array($valueMinQ,$valueMaxQ),
'type' => 'numeric',
'compare' => 'BETWEEN'
)
)
);
}
но теперь другой вопрос а сколько можно поисковых фраз вбивать в
s' => $_GET['word'], к примеру 's' => array([0]=>$_GET['word']."&",[1]=>$_GET['word1']."&"
Все у меня получилось но немного не так
$searhWord = $_GET['word'];
if(!$searhWord){'';}else{$searhWord = $_GET['word'].", ";};
$searhWord .= $_GET['prodcat'];
$args = array(
'post_type' => 'post',
's' => $searhWord,
'paged' => get_query_var( 'paged' ),
'posts_per_page' => -1,);
вот так
Здравствуйте, Андрей!
Огромное Вам спасибо за фильтр!
У меня возникла проблема: Поиск по нескольким произвольным полям ничего не находит. Пожалуйста, напишите пример с тремя произвольными полями в форме поиска. Где, например, одно из полей это название района города, которое выбирается посредством выпадающего меню select option.
Заранее благодарю Вас за ответ!
при поиске по нескольким произвольным полям массив должен быть построен по такому принципу:
$args = array(
'post_type' => 'product',
'meta_query' => array(
array(
'key' => 'color',
'value' => 'blue',
'compare' => 'NOT LIKE'
),
array(
'key' => 'price',
'value' => array( 20, 100 ),
'type' => 'numeric',
'compare' => 'BETWEEN'
)
)
);
Андрей, огромное спасибо за оперативность! Очень ждал ответа.
Добрый день,
Скажите, а есть ли какой-то вариант, сделать так, чтобы настройки фильтра запоминались после того как меня перебрасывает на страницу результатов?
К примеру, в поле диапазона цен я вбил "от 200 до 1000", нажал "получить товары" и на страничке результатов в поле диапазона цен остались те же значения, а не сбросились по нулям?
Спасибо!
Вот с полями диапазона цен, сделал простое условие:
<input type="text" name="min-price" size="3" value=""/>
<input type="text" name="max-price" size="3" value=""/>
А с полями "select" и "option" в пхп не могу понять как сделать, судя по всему нужно яву задействовать и куки, но я в них дуб, сам пхп только недавно начал изучать. Поэтому если кто поможет, буду очень признателен.
Спасибо!
ни куки, ни js использовать для этой задачи не требуется. Надо использовать значение $_GET для подстановки текущих значений в форму.
Например, для текстового поля:
< input type="text" name="min-price" size="3" value="< ? php echo $_GET['min-price'] ? >"/>
А для чекбокса будет так:
< input type="checkbox" name="min-price" < ? php checked($_GET['min-price'],1); ? > value="1"/>
так и не разобрался. с формой поиска вроде понятно. не работает файл page-customsearch
просто пустое окно.
у меня сортировка по ценам, от 5 000 до 30 000 тыс. помогите пожалуста. цены указаны при помощи плагина magic fields, текстовое поле. заранее спасибо.
Если файл для вывода результатов поиска создан верно, то пустого окна или белого экрана никак не должно быть. Видимо при создании файла вы допустили ошибку в синтаксисе php, поэтому информация на странице не выводится. Выводится должно хоть что то даже если обработка данных с фильтра настроена неверно.
Вопрос: а если будет два поля: вес и цена тоже с диапазоном...
'meta_query' => array(
array(
'key' => 'part_price',
'value' => array( (int)$_GET['min-price'], (int)$_GET['max-price'] ),
'type' => 'numeric',
'compare' => 'BETWEEN'
),
array(
'key' => 'part_weight',
'value' => array( (int)$_GET['min-weight'], (int)$_GET['max-weight'] ),
'type' => 'numeric',
'compare' => 'BETWEEN'
)
и допустим вводится диапазон только цен, а вес пустой, к примеру генерится такой урл: ?min-price=10&max-price=50&min-weight&max-weight
и понятное дело, что в таком случаи код ничего не находит. Как быть в таком случаи подскажите?
Для диапазонов надо обязательно делать проверку переданных значений на их присутствие и назначать минимальное значение ноль, а максимальное значение - 99999... при их отсутствии. Например:
if(!$_GET['min-price'])$_GET['min-price']=0;
if(!$_GET['max-price'])$_GET['max-price']=9999999;
ок спасибо
подскажите, а допустим массив категорий для таксономии - он же тоже может быть пустым, как тогда быть?
$taxquery[] = array();
if ($_GET['standarts']) {
array_push($tax_q, array(
'taxonomy' => 'standarts',
'field' => 'id',
'terms' => array($_GET['standarts'])
));
}
$args = array(
....
'tax_query' => array($taxq),
...
что нибудь наподобие этого, или как посоветуете сделать?
да, тоже проверяете его на наличие и если его нет, то не добавляете в основной массив. Сформировав основной массив вы можете делать проверки на наличие тех или иных данных и если они присутствуют, то дополнять основной массив запроса $args. Что то типа:
if (!$_GET['standarts']) {
$args['tax_query'] = array(
‘taxonomy’=>'standarts',
‘field’ => ‘id’,
‘terms’ => array($_GET['standarts'])
);
}
теперь понял в чём ещё моя ошибка: chekbox передавал не как массив, ещё не понял как это сделать в форме... думаю найду решение, во всяком случаи обработка такой же останется, верно?
можно ещё один вопрос, что я делаю не так? просто с этим кодом что вы скинули - он хорош для одного значения, а как "запушить" несколько? пуш в комментах, но он как то не так работает(
if (isset($_GET['marki'])) {
$args['tax_query'] = array(
array(
'taxonomy'=>'marki',
'field' => 'id',
'terms' => $_GET['marki']
)
);
}
if (isset($_GET['modeli'])) {
$args['tax_query'] = array(
array(
'taxonomy'=>'modeli',
'field' => 'id',
'terms' => $_GET['modeli']
)
);
}
// if (isset($_GET['marki'])) {
// array_push($args, 'tax_query', array(
// array(
// 'taxonomy'=>'marki',
// 'field' => 'id',
// 'terms' => $_GET['marki']
// )));
// }
// if (isset($_GET['modeli'])) {
// array_push($args, 'tax_query', array(
// array(
// 'taxonomy'=>'modeli',
// 'field' => 'id',
// 'terms' => $_GET['modeli']
// )));
// }
Я делал так и все работает:
if($_GET[$field['slug']]){
$arg_tax['taxonomy'] = $field['tax'];
$arg_tax['field'] = 'slug';
$arg_tax['terms'] = $_GET[$field['slug']];
$args['tax_query'][] = $arg_tax;
}
Во-первых хочу поблагодарить за подробный урок, наконец-то начало что-то получаться. Но у меня сразу два вопроса:
1. Мне нужно разместить фильтр на странице с записями, то есть страница на которой уже отображаются записи блога. В этом примере поиск происходит на странице без записей и как результат выводится список записей согласно выбранных параметров в форме. Иными словами, как сделать такой поиск на главной странице, чтобы изначально отображались все записи, а потом после фильтрации только записи из массива.
2. После отправки формы все значения обнуляются и форма снова приобретает изначальный вид, то есть не запоминаются выбранные значения. Как "заставить" запомнить введенные значения?
1. данные с формы следует передавать на главную страницу:
Спасибо за ответ, но у меня сложный случай, я не настолько хорошо во всем разобрался. Поэтому сложновато понять даже в каком месте кода вставлять эту проверку. Сейчас у меня выглядит так:
// -- Начало фильтра
'post',
'meta_key' => $_GET['meta_key'],
'meta_query' => array(
array(
'key' => 'select_type',
'value' => $_GET['type'],
'type' => 'text',
'compare' => 'IN'
),
array(
'key' => 'shot_date',
'value' => array( (int)$_GET['min-date'], (int)$_GET['max-date'] ),
'type' => 'numeric',
'compare' => 'BETWEEN'
)
)
);
query_posts( $args ); ?>
// -- Конец фильтра
Данные формы передаются на главную. Изначально главная пустая, посты появляются после передачи данных формы.
PS код не отображается полностью, почему-то
Изначально на главной странице как правило располагается обычный цикл ВП
if(have_posts())...
как правило на главной странице он выводит последние записи сайта.
Вам надо вставить до него свой фильтр с проверкой на наличие гет-запроса, что то типа этого:
if($_GET['word']){
...тут размещаете свой массив обработчик с функцией query_posts...
}
Как-то так?
'meta_query' => array(
if($_GET['type']){
'key' => 'select_type',
'value' => $_GET['type'],
'type' => 'text',
'compare' => 'IN'
}
if($_GET['place']){
'key' => 'select_place',
'value' => $_GET['place'],
'type' => 'text',
'compare' => 'IN'
}
Моя демостраница http://historydev.96.lt/
по поводу содержимого вашего массива я ничего сказать не могу, тк вам виднее, что у вас там должно быть, но по приложенному коду могу сказать точно, что он работать не будет, вы нарушили синтаксис построения массива.
Если у вас наблюдаются проблемы с построением поискового фильтра, то могу предложить приобрести плагин Post Filter Generator, с помощью которого вы сможете создать поисковый фильтр без проблем.
Благодарю, Андрей, за ответы. Использовать плагины для фильтрации по 3 произвольным полям очень не хочется, тем более платным, хватает и бесплатных решений. Буду пытаться разобраться.
Составил массив таким образом
if ( ($_GET['type'] == '') && ($_GET['place'] == '') && ($_GET['min-date'] == '') && ($_GET['max-date'] == '') ) {
$args = array(
'post_type' => 'post',
'meta_key' => $_GET['meta_key'],
'meta_query' => array(
array(
'key' => 'shot_date',
'value' => array( 1870, 1991 ),
'type' => 'numeric',
'compare' => 'BETWEEN'
)
)
);
query_posts( $args );
} elseif (
($_GET['type'] == '') && ($_GET['min-date'] == '') && ($_GET['max-date'] == '') ) {
$args = array(
'post_type' => 'post',
'meta_key' => $_GET['meta_key'],
'meta_query' => array(
array(
'key' => 'select_place',
'value' => $_GET['place'],
'type' => 'text',
'compare' => 'IN'
),
array(
'key' => 'shot_date',
'value' => array( 1870, 1991 ),
'type' => 'numeric',
'compare' => 'BETWEEN'
)
)
);
query_posts( $args );
} elseif (
($_GET['place'] == '') && ($_GET['min-date'] == '') && ($_GET['max-date'] == '') ) {
$args = array(
'post_type' => 'post',
'meta_key' => $_GET['meta_key'],
'meta_query' => array(
array(
'key' => 'select_type',
'value' => $_GET['type'],
'type' => 'text',
'compare' => 'IN'
),
array(
'key' => 'shot_date',
'value' => array( 1870, 1991 ),
'type' => 'numeric',
'compare' => 'BETWEEN'
)
)
);
query_posts( $args );
} else {
$args = array(
'post_type' => 'post',
'meta_key' => $_GET['meta_key'],
'meta_query' => array(
array(
'key' => 'select_type',
'value' => $_GET['type'],
'type' => 'text',
'compare' => 'IN'
),
array(
'key' => 'select_place',
'value' => $_GET['place'],
'type' => 'text',
'compare' => 'IN'
),
array(
'key' => 'shot_date',
'value' => array( (int)$_GET['min-date'], (int)$_GET['max-date'] ),
'type' => 'numeric',
'compare' => 'BETWEEN'
)
)
);
query_posts( $args );
}
Теперь, в принципе, работает. Но проблема с пустыми значениями. Все равно передается пустое значение из формы. По этой причине данные не выводятся, пока не добавить значение. Как «игнорировать» пустое значение и выводить записи только по заполненным или может есть способ для пустого значения value в форме назначить параметр типа «all»? чтобы в случае пустого значения в массиве для value обозначить все значения из key?
Работает даже так:
if ( ($_GET['type'] == '') && ($_GET['place'] == '') && ($_GET['min-date'] == '') && ($_GET['max-date'] == '') ) {
} else {
$args = array(
'post_type' => 'post',
'meta_key' => $_GET['meta_key'],
'meta_query' => array(
array(
'key' => 'select_type',
'value' => $_GET['type'],
'type' => 'text',
'compare' => 'IN'
),
array(
'key' => 'select_place',
'value' => $_GET['place'],
'type' => 'text',
'compare' => 'IN'
),
array(
'key' => 'shot_date',
'value' => array( (int)$_GET['min-date'], (int)$_GET['max-date'] ),
'type' => 'numeric',
'compare' => 'BETWEEN'
)
)
);
query_posts( $args );
}
Но никак не могу убрать из массива пустое поле, чтобы оно не учитывалось при фильтрации.
Убирал из основного массива поля которые могут быть пустыми, добавлял с проверкой, как описано в комментариях:
if (!$_GET['standarts']) {
$args['tax_query'] = array(
‘taxonomy’=>’standarts’,
‘field’ => ‘id’,
‘terms’ => array($_GET['standarts'])
);
}
Все равно в урле учитываются пустые поля
Помогите, читаю пост и комментарии — у всех все получилось.
Я создал файл page-customsearch и разместил в нем итоговый код указанный в посте. Создал страницу с именем customsearch, разместил в ней форму запроса указанную в данном посте.
Страница customsearch открывается без формы запроса.
Удалил с сервера созданный шаблон файла page-customsearch, страница customsearch открывается с формой запроса (естественно не рабочей).
Помогите пожалуйста понять в чем ошибка. Почему страница запроса с файлом шаблона конфликтуют?
может быть дело в возможном кешировании на сайте?
Подскажите, что делаю не так? Делаю как в мануале и не работает.
Есть произвольный тип записи в function.php выглядит так:
/* Регистрируем Лучшее и таксономию для них
————————————————*/
add_action(‘init’, ‘thebest’);
function thebest()
{
$labels = array(
‘name’ => ‘Лучшее’,
‘singular_name’ => ‘Лучшее’,
‘add_new’ => ‘Добавить лучшее’,
‘add_new_item’ => ‘Добавить новую позицию’,
‘edit_item’ => ‘Редактировать лучшее’,
‘new_item’ => ‘Новая позиция’,
‘view_item’ => ‘Посмотреть лучшее’,
‘search_items’ => ‘Найти лучшее’,
‘not_found’ => ‘Лучшее не найдено’,
‘not_found_in_trash’ => ‘В корзине лучшее не найдено’,
‘parent_item_colon’ => »,
‘menu_name’ => ‘Лучшее’
);
$args = array(
‘labels’ => $labels,
‘public’ => true,
‘publicly_queryable’ => true,
‘show_ui’ => true,
‘show_in_menu’ => true,
‘query_var’ => true,
‘rewrite’ => true,
‘capability_type’ => ‘post’,
‘has_archive’ => true,
‘hierarchical’ => false,
‘menu_position’ => 5,
‘menu_icon’ => ‘dashicons-heart’,
‘supports’ => array(‘title’,’editor’,’thumbnail’,’comments’,’custom-fields’, ‘author’),
‘taxonomies’ => array(‘thebests’)
);
register_post_type(‘thebest’,$args);
}
register_taxonomy( ‘rubrika-thebest’, ‘thebest’, array( ‘hierarchical’ => true, ‘label’ => ‘Рубрики’, ‘query_var’ => true, ‘rewrite’ => true ) );
Создаю форму:
Поисковый запрос
Диапазон цены
от
до
Вывожу в цикле:
‘thebest’,
‘s’ => $_GET[‘word’],
‘meta_key’ => $_GET[‘meta_key’],
‘posts_per_page’ => $_GET[‘num’],
‘paged’ => get_query_var( ‘paged’ ),
‘order’ => $_GET[‘order’],
‘orderby’ => $_GET[‘orderby’],
‘tax_query’ => array(
array(
‘taxonomy’ => ‘rubrika-thebest’,
‘field’ => ‘id’,
‘terms’ => array($_GET[‘rubrika-thebest’])
)
),
‘meta_query’ => array(
array(
‘key’ => ‘product-price’,
‘value’ => array( (int)$_GET[‘min-price’], (int)$_GET[‘max-price’] ),
‘type’ => ‘numeric’,
‘compare’ => ‘BETWEEN’
)
)
);
query_posts( $args ); ?>
‘thebest’, ‘posts_per_page’ => 30 ) ); ?>
Извините, но у нас пока нет информации о товарах и услугах с выгодными ценами.
have_posts() ) : $thebest->the_post(); ?>
<div id=»post_»>
<a href="» class=»thumb»> trim(strip_tags( $post->post_title )),
‘title’ => trim(strip_tags( $post->post_title )),
)); ?>
<img src="/img/thumb-small.png» alt=»» />
<a href="#" onclick="openbox('box-‘); return false» title=»»>
<a href=" $val_val ) echo $val_val; } ?>» title=»» target=»_blank»>Где купить
• $val_val ) echo $val_val; } ?> руб
<div class="entry excerpt" id="box-» style=»display: none;»>
размещать код в комментариях бесполезно, воспользуйтесь каким то сервисом для этого, например, _http://pastebin.com/ и дайте ссылку на свой код.
Вот ссылка, прошу помочь http://pastebin.com/aHGmegb3
Имя произвольного поля product-price
не пытайтесь сразу строить сложные поисковые запросы со сложным массивом в функции query_posts, идите от простого к сложному, постепенно добавляя в свой фильтр новые поля и проверяя работу формы при каждом таком добавлении. Так вы сможете понять, где именно у вас возникла проблема.