Делаю фильтр под магазин, есть дополнительное поле shop_sells , в котором есть параметры, первый пустой, остальные Акция, Распродажа, Скидка, поле в админке осуществляется в виде выпадющего списка.
Вопрос в том, что нужно дописать к обработчику:
'meta_key' => $_GET['meta_key'],
Думал приписывать в фильтр meta_key по value, но он не работает.
код хтмл
<p><label>Сортировка по</label><br /> <select name="meta_key"> <option value="shop_sells">Вид акции</option> </select> </p> <select name="shop_sells"> <option value="akcia">Акция</option> <option value="byprice">Распродажа</option> <option value="selldown">Скидка</option> </select>
Я дописал в кастомный поиск:
array( 'key' => 'shop_sells', 'value' => '', 'value' => 'akcia', 'value' => 'byprice', 'value' => 'selldown', 'compare' => 'NOT LIKE' )
Видимо в форме чтото не так. если убрать сортировку по meta_key, тоже не фильтрует.
не верно формируете массив на основе переданных данных с формы.
Пример из статьи:
'meta_query' => array( array( 'key' => 'price-products', //meta_key произвольного поля 'value' => array( $_GET['min-price'], $_GET['max-price'] ), //значение произвольного поля 'type' => 'numeric', 'compare' => 'BETWEEN' ) )
Андрей Plechev сказал(а)
не верно формируете массив на основе переданных данных с формы.
Пример из статьи:
'meta_query' => array( array( 'key' => 'price-products', //meta_key произвольного поля 'value' => array( $_GET['min-price'], $_GET['max-price'] ), //значение произвольного поля 'type' => 'numeric', 'compare' => 'BETWEEN' ) )
Так, тогда у меня получается с хтмл проблемы, можно сформировать option value в кирилице? такого типа:
sw_sell у меня доп.поле, выпадающий список тип поля, поля списка на русском, не могу понять элементарного, как его выдернуть правильно...
<p><label>По спецпредложениям</label><br /> <select name="sw_sell"> <option value="Акция" >дате добавления</option> <option value="Распродажа">заголовку</option> <option value="Скидка">цене</option> <option value="Заканчивается">цене</option> </select> </p>
и функция будет тогда дополнительно
'meta_query' => array( array( 'key' => 'sw_sell', //meta_key произвольного поля 'value' => array( $_GET['Акция'], $_GET['Распродажа'], $_GET['Скидка'] ,$_GET['Заканчивается']) //значение произвольного поля 'type' => 'text', 'compare' => '=' ) )
или все таки правильнее сделать так:
<select name="sw_sell"> <option value="akcia">Акция</option> <option value="byprice">Распродажа</option> </select>
и указать :
'value' => array( $_GET['akcia'], $_GET['byprice'] ),
Так получится то wp сам присваивает и находит значение? Те option присваивает параметр 1,2,3 и тд, а то как кириллически это называется, значения не имеет?
Во-первых, GET передает параметр name со значением value
т.е. из вашей формы будет передаваться $_GET['sw_sell']
Во-вторых, массиве meta_query значение value может быть любым, но в него массив передается только в случае compare=BETWEEN, в вашем же случае надо передавать просто $_GET['sw_sell'], что будет внутри, по тому и будет производится поиск
'meta_query' => array( array( 'key' => 'sw_sell', 'value' => $_GET['sw_sell'] 'type' => 'text', 'compare' => '=' ) )
Андрей Plechev сказал(а)
Во-первых, GET передает параметр name со значением value
т.е. из вашей формы будет передаваться $_GET['sw_sell']
Во-вторых, массиве meta_query значение value может быть любым, но в него массив передается только в случае compare=BETWEEN, в вашем же случае надо передавать просто $_GET['sw_sell'], что будет внутри, по тому и будет производится поиск
'meta_query' => array( array( 'key' => 'sw_sell', 'value' => $_GET['sw_sell'] 'type' => 'text', 'compare' => '=' ) )
Параметр передает, но к сожалению пос не выводит...
Андрей Plechev сказал(а)
значит пост не найден, вы передаете не полные данные и не уверен, что точные, чтобы можно было сказать где у вас ошибка.
Я выбираю к примеру "заканчивается", print_r мне выводит small_quant , форма поиска передает sw_sell=small_quant&num=-1&meta_key=price-products . С какой стороны не посмотри, все должно работать...Может просто я не в том месте формы вывожу код выбора вида акции? Он в форме у меня идет после : "сортировка по"
Андрей Plechev сказал(а)
вообще не понятно к чему тут это meta_key=price-products
по какому типу постов производится поиск? если тип записей не post, то его надо обязательно указывать в массиве аргументов к query_posts
Это я, дурак, с примера скопировал и не удалилв конце формы данные с примером. Сейчас убрал и все равно таже история, пост не выводится...Ищу по продуктам, как по умолчанию в recall, в query все аргументы стоят как в примере.
попытался поставить:
query_posts('post_type=products');
выводит просто все продукты в ряд.
Вот, теперь понял почему ничего не фильтрует, когда добавил второй массив в meta_query перестал работать поиск полностью, если его удалить то сам поиск отдельно работает как обычно.
$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' ), array( 'key' => 'sw_sell', 'value' => $_GET['sw_sell'], 'type' => 'text', 'compare' => '=' ) ) ); query_posts( $args ); ?>
Вы если не понимаете как это вообще работает, но не надо сразу брать готовый пример и пытаться его изменить, лучше сделайте сначала сами небольшую форму с одним-двумя полями работайте с ней.
Я не понимаю, если массив формируется полностью как из примера с добавлением поиска по доп. произвольному полю, то как выглядит форма?
Андрей Plechev сказал(а)
Вы если не понимаете как это вообще работает, но не надо сразу брать готовый пример и пытаться его изменить, лучше сделайте сначала сами небольшую форму с одним-двумя полями работайте с ней.
Я не понимаю, если массив формируется полностью как из примера с добавлением поиска по доп. произвольному полю, то как выглядит форма?
Принцип я понял, мне нужно было все основное и формы + сделать поиск по акциям и скидкам из одного произвольного поля, код формы:
<!-- Фильтр --> <div id="customsearch"> <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="4">Первая категория</option> <option value="6">Вторая категория</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 /> <select name="this_sale"> <option value="">--------</option> <option value="akcia">Акция</option> <option value="sell_prod">Распродажа</option> <option value="perce_prod">Скидка</option> <option value="small_quant">Заканчивается</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> </form> </div>
Андрей Plechev сказал(а)
выведите массив $args через print_r после отправки данных с формы и скиньте сюда результат
Array Array ( [post_type] => products [s] => Слово [meta_key] => [posts_per_page] => -1 [paged] => 0 [order] => DESC [orderby] => title [tax_query] => Array ( [0] => Array ( [taxonomy] => prodcat [field] => id [terms] => Array ( [0] => 4 ) ) ) [meta_query] => Array ( [0] => Array ( [key] => price-products [value] => Array ( [0] => 1000 [1] => 5000 ) [type] => numeric [compare] => BETWEEN ) ) )
Андрей Plechev сказал(а)
т.е. у вас есть товар находящийся в товарной категории - ID 4, имеющий в названии вхождение "Слово" и находящийся в диапазоне цен от 1000 до 5000?
Так точно, по нему и искал...ето без второго массива, а со вторым массивом(тот что по акциями ищет), код такой
Array ( [post_type] => products [s] => товар [meta_key] => [posts_per_page] => -1 [paged] => 0 [order] => DESC [orderby] => date [tax_query] => Array ( [0] => Array ( [taxonomy] => prodcat [field] => id [terms] => Array ( [0] => 4 ) ) ) [meta_query] => Array ( [0] => Array ( [key] => price-products [value] => Array ( [0] => 1000 [1] => 5000 ) [type] => numeric [compare] => BETWEEN ) [1] => Array ( [key] => this_sale [value] => small_quant [type] => text [compare] => = ) ) )
Название дополнительного поля поменял на this_sale и оформлено в виде чекбокса, работаю с ADVCustomFields.
вроде все верно.
Когда не ясна причина проблемы, лучше всего пока забыть про форму и попробовать сформировать массив с данными вручную, например, проверим получение товаров:
$args = array('post_type'=>'products'); query_posts($args);
Если товары получаем, то усложняем массив дополнив его выборкой по цене:
$args = array( 'post_type'=>'products', 'meta_query'=>array('key'=>'price-products','value'=>array(1000,5000),'type'=>'numeric') ); query_posts($args);
Если все получилось, то усложняем массив еще.
Таким образом можно проверить правильно ли формируется массив или на каком то этапе допущена ошибка.
Андрей Plechev сказал(а)
ну так надо было ранее написать об этом, я бы не запрашивал код формы и весь массив данных.
Есть уверенность, что произвольное поле с meta_key = this_sale принадлежит какому-либо товару?
Пробуйте передать данный массив вручную как я писал выше.
Я в середине еще написал) думал не так важно, раз не заметили. Привязано поле к типу записи = products 100%
Андрей Plechev сказал(а)
Пробуйте передать данный массив вручную как я писал выше.
$args = array( 'post_type'=>'products', 'meta_query'=>array('key'=>'this_sale','value'=>'small_quant') ); query_posts($args);
что получается?
Таже беда, совсем не работает. Кстати если не отправлены значения мин и макс цены, тогда тоже отсев не идет, если к примеру выбрана только одна категория и все. Еще пытался сделать отсев по возрастанию и убыванию поля price-product , выдает ошибку..