Учитывая как часто пользователи интересуются этой темой, я решил написать сей пост, который может помочь в решении многих задач, основная из них - создание фильтра для получения определенных записей или страниц.
Именно создание фильтра чего-либо является наверное наиболее востребованной задачей на сайте, будь то интернет-магазин или обычный блог о кулинарии. Предложить фильтр посетителю значит упростить его жизнь на вашем сайте, сделать его более понятным и дружелюбным.
Проблема в том, что нельзя создать какой то универсальный фильтр, который бы подошел для всех сайтов. Задачи у всех разные и содержимое фильтра на одном сайте будет отличаться от другого, поэтому создание фильтра для сайта - задача строго индивидуальная и полностью возлагается на вебмастера.
Можно воспользоваться услугами специалиста, объяснить, что вам от него надо и получить готовый результат. А если вам захочется внести изменения? Это затратный способ и не практичный. Гораздо приятнее, что то сделать самому, разобраться в этом вопросе и в последствии совершенствовать свои навыки, находя новые пути решения своей задачи)
Давайте для начала рассмотрим логику работы любого фильтра.
Фильтр работает в два этапа:
- Отсылает в обработчик параметры выбранные пользователем в форме фильтрации
- Обработчик принимает значения, обрабатывает их и выдает результат обработки в виде какой то информации.
т.е. по логике нам надо написать код формы фильтрации и обработчик, который будет принимать данные с этой формы.
Работая с сайтом на WordPress очень полезно знать о том, что мы можем отправить данные из фильтра напрямую системе WordPress, возложив на нее работу по обработке и выдаче результата запроса, без необходимости писать этот обработчик самому. Иными словами, нам можно написать только форму фильтра следуя определенным правилам, чтобы составить правильный запрос к БД WordPress и WordPress быстро выдаст нам результат. Почему бы в начале своего пути разработчика фильтра для своего сайта не пойти кратчайшим путем и не использовать эту возможность?
Допустим, что составлять html-формы мы уже умеем, тогда дело за малым - вникнуть в правила создания запроса к БД WordPress из этой формы.
Давайте для начала определимся с основными правилами.
- Метод передачи данным будет использоваться GET
- Переданные параметры разделяются знаком амперсант (&)
Следуя этим несложным правилам можно понять, что запрос мы должны строить по такому принципу
exаmple.ru/?первый_параметр=значение_параметра&второй_параметр=значение_параметра&....
и подобным образом мы можем строить запросы практически любой сложности и длины.
Что же нам надо передавать в качестве параметров и их значений? А вот это и есть самая суть этого поста, к которой мы сейчас и переходим.
Важно понимать, что запрос мы будем строить последовательно, словно кирпичики укладывая параметры со своими значениями в запрос и каждый последующий параметр будет уточнять весь запрос.
Например, нам надо получить все записи автора admin, за 2013 год и вывести только последние 20. Тогда структура запроса будет выглядеть так:
exаmple.ru/?автор=admin&год=2013&количество=20
это не рабочий пример, это структура запроса, логика его построения.
Если значения параметров запроса нам более-менее известны, то сами параметры которые нам надо передавать нет. Поэтому мы перейдем к рассмотрению этих параметров.
Параметры которые мы можем передавать в запрос мы можем разделить на группы:
- Параметры Категорий
- Параметры Меток
- Параметры Авторов
- Параметры Постов и Страниц
- Параметры Типов постов
- Параметры Таксономий
- Параметры Времени
- Параметры Сотрировки и порядка
- Параметры Поиска
- Комбинации параметров
Рассмотрим каждую группу этих параметров подробнее.
Параметры категорий
Данные параметры получают записи из определенных категорий
cat (число) - в качестве значения передаем ID категории, можем перечислять их через запятую
category_name (строка) - передаем ярлык нужной к выводу категории
Примеры
1. Получим записи из категории идентификатор которой равен 5
exаmple.ru/?cat=5
2. Получим записи из нескольких категорий
exаmple.ru/?cat=10,20
3. Получим все записи за исключением указанных категорий
exаmple.ru/?cat=-11,-25
4. Получим записи из категорий с указанным ярлыком
exаmple.ru/?category_name=order,slims
Параметры меток
Выводят записи содержащих указанные метки
tag (строка) - в качестве значения можно передавать ярлыки меток
tag_id (число) - в качестве значения указываются идентификаторы нужных меток
Примеры
1. Получим записи содержащие указанную метку
exаmple.ru/?tag=book
exаmple.ru/?tag_id=15
2. Получить все посты содержащие хотя бы одну из указанных меток
exаmple.ru/?tag=book,clock
exаmple.ru/?tag_id=15,36,5
3. Получим все записи которые содержат все указанные метки
exаmple.ru/?tag=book+clock+days
Параметры авторов
Выводят посты указанных авторов
author (число) - в качестве параметра указывается идентификатор нужного автора
author_name (строка) - указывается логин нужного автора
Примеры
1. Получить все записи указанного автора
exаmple.ru/?author=56
exаmple.ru/?author_name=petya
2. Получить записи всех указанных авторов
exаmple.ru/?author=33,78,12
exаmple.ru/?author_name=petya,vasya
3. Вывести все записи кроме указанного автора
exаmple.ru/?author=-56
Параметры постов и страниц
p (число) - идентификатор поста, который желаем получить
name (строка) - ярлык нужного нам поста
page_id (число) - идентификатор страницы, которую желаем получить
pagename (строка) - ярлык нужной нам страницы
post_parent (число) - идентификатор родительской страницы дочерние страницы которой мы хотим получить.
Примеры
1. Получим указанную запись
exаmple.ru/?p=54
exаmple.ru/?name=title_post
2. Получим указанную страницу
exаmple.ru/?page_id=89
exаmple.ru/?pagename=slug_page
3. Выведем все страницы, являющиеся дочерними для указаной
exаmple.ru/?post_parent=69
4. Получим определенную дочернюю страницу по ее ярлыку. Родительская и дочерняя страницы разделяются знаком слеша
exаmple.ru/?pagename=country/russia
5. Получим страницы только верхнего уровня, исключив дочерние
exаmple.ru/?post_parent=0
Параметры типов страниц
post_type (строка) - получает записи определенного типа
Типы записей могут быть стандартными для вордпресс, их можно передавать в качестве значения к параметру в любом случае, они могут быть:
any - получаем все типы записей кроме revision
attachment - выводим вложения для записей
page - страница.
post - пост.
revision - ревизия.
Также в качестве параметров могут передаваться произвольные типы записей, созданные плагинами, шаблонами или пользователем
Примеры
1. Получим только записи типа post
exаmple.ru/?post_type=post
2. Получим записи произвольного типа, исключив все остальные
exаmple.ru/?post_type=orders
Параметры таксономий
Получаем записи из определенной таксономии
Здесь рассматриваются пользовательские таксономии.
В качестве передаваемого параметра указывается нужная таксономия, а в качестве ее значения ярлык нужного нам термина
Примеры
1. Получим все записи из таксономии prodcat принадлежащие ее термину slug_term
exаmple.ru/?prodcat=slug_term
Параметры времени
Получаем записи за определенный период времени
year (число) - указываем нужный год публикации записей
monthnum (число)- указываем нужный месяц публикации записей
w (число) - указываем нужную неделю публикации (с 0 до 53)
day (число) - день публикации (1 - 31)
hour (число) - час публикации (0 - 23)
minute (число) - Минута (0 - 60)
second (число) - Секунда (0 - 60)
m (число) - ГодМесяц (201306)
Примеры
1. Получим записи за 2012 год
exаmple.ru/?year=2012
2. Выведем все публикации за 12 сентября 2011 года
exаmple.ru/?m=201109&day=12
Параметры сортировки и порядка
Сортируют выводимые записи и устанавливают порядок сортировки.
order (строка) - Направление сортировки по параметру orderby, может быть:
ASC - по порядку, от меньшего к большему (1, 2, 3; a, b, c).
DESC - в обратном порядке, от большего к меньшему (3, 2, 1; c, b, a) .
orderby (строка) - Поля по которым можно сортировать посты. Может быть
none - не сортировать, выводить прям как находиться в БД. равносильно сортировке по ID. С версии 2.8.
ID - сортировка по ID.
author - сортировка по ID авторов.
title - сортировка по заголовку.
name - по названию поста (слаг поста).
date - сортировка по дате публикации.
modified - сортировка по дате изменения.
parent - сортировка по значению поля parent.
rand - случайный порядок.
comment_count - сортировка по количеству комментариев. С версии 2.9.
menu_order - стандартно используется для страниц и вложений. Порядковый номер указывается на странице редактирования поста.
meta_value Важно: параметр meta_key так же должен быть определен. Заметка: сортировка будет алфавитной и будет не логична, если значения
произвольных полей числа (будет, например, так 1, 3, 34, 4, 56, 6 и т.д., а не 1, 3, 4, 6, 34, 56).
meta_value_num - сортировка по произвольным полям значения которых являются числами.
Примеры
1. Сортировка по заголовку выводимых записей
exаmple.ru/?orderby=title&order=DESC
2. Сортировка по количеству комментариев
exаmple.ru/?orderby=comment_count
3. Отсортируем выводимые товары по цене
exаmple.ru/?post_type=product&orderby=meta_value&meta_key=price
Параметры поиска
Получаем посты соответствующие поисковому запросу
s - параметр, значением которого является поисковый запрос
Пример
1. Получить записи по поисковому запросу "контент"
exаmple.ru/?s=контент
Комбинации запросов
1. Получим записи из категории 4 за 2012 год
exаmple.ru/?cat=4&year=2012
2. Получим все записи автора admin из категории 5 и 6 и отсортируем по заголовку
exаmple.ru/?author_name=admin&cat=5,6&orderby=title&order=DESC
И так, рассмотрев перечисленные параметры, которые мы можем передавать в запрос, можем приступить к написанию несложных форм фильтров, которыми пользователи нашего сайта могут пользоваться на вашем сайте. Все возможные варианты не покажу, но направление развития задам)
1. Предоставим фильтр по которому пользователь сможет получить записи из нужной категории, соответствующие поисковому запросу с указанием сортировки полученных результатов по заголовку по возрастанию или по убыванию:
<form action="/" method="get"> <p><label>Поисковый запрос</label><br /> <input type="text" name="s" value=""></p> <p><label>Укажите категорию поиска</label><br /> <select name="cat"> <option value="">--------</option> <option value="10">Категория 10</option> <option value="11">Категория 11</option> <option value="15">Категория 15</option> <option value="23">Категория 23</option> </select> </p> <p><label>Сортировка по заголовку</label><br /> <input type="radio" name="order" value="DESC"> по убыванию<br /> <input type="radio" name="order" value="ASC"> по возрастанию </p> <input type="hidden" name="orderby" value="title"> <p><input type="submit" value="Получить записи"></p> </form>
2. Фильтр получения товаров принадлежащих таксономии products, с возможностью сортировки результата по дате добавления или заголовку и имеющих определенные метки:
<form action="/" method="get"> <p><label>Поисковый запрос</label><br /> <input type="text" name="s" value=""></p> <p><label>Укажите товарную категорию:</label><br /> <select name="products"> <option value="">--------</option> <option value="books">Книги</option> <option value="clocks">Часы</option> <option value="glasses">Очки</option> <option value="scarfs">Шарфы</option> </select> </p> <p><label>Метка товара:</label><br /> <select name="tag"> <option value="">--------</option> <option value="sale">Распродажа</option> <option value="new">Новинки</option> <option value="hits">Хиты продаж</option> </select> </p> <p><label>Сортировка по</label><br /> <select name="orderby"> <option value="date">дате добавления</option> <option value="title">заголовку</option> </select> </p> <p><label>Направление сортировки:</label><br /> <input type="radio" name="order" value="DESC"> по убыванию<br /> <input type="radio" name="order" value="ASC"> по возрастанию </p> <p><input type="submit" value="Получить записи"></p> </form>
Освоив этот материал вы сможете легко создавать несложные фильтры не только для своих сайтов, но и для чужих) и более этот вопрос для вас не будет неразрешимой проблемой.
Если вам недостаточно предоставленных тут примеров реализации запросов к БД или вы думаете, что данная информация является неполной, то прошу отписаться в комментариях, будем дополнять материал вместе. Делитесь созданными фильтрами для своих сайтов, наверняка они будут интересны другим.
Андрей пожалуйста подскажи а как сделать спомощью флажков) тоесть голочки по нужным категориям товара выставил и они появились) Извените за столько много вопросов.
можно попробовать передавать параметры через чекбоксы. тут код показать не смогу, почитайте в инете инфу как делать чекбоксы.
хорошо попробую, если получиться скину код)
Андрей, а не подскажешь в какой версии поддержка параметров произвольных полей появилась?
/?meta_key=color&meta_value=black - это в строке урл не поддерживается, в моём WordPress 3.2.1 - тока что проверил. А остальное успешно использовал при построении ajax запроса в фильтре.
Еще стоит добавить в конец статьи для обладателей популярного плагина wp-postratings: у него в урл можно передавать два параметра сайт-точка-ру/?r_sortby=most_rated - параметр для часто голосуемых записей, а сайт-точка-ру/?r_sortby=highest_rated - самые рейтинговые записи.
Плагин wp-postviews - тоже популярный плагин считающий количество просмотра статьи. У него передается параметр сайт-точка-ру/?v_sortby=views - выводит самые просматриваемые записи
Действительно, с произвольными полями работать таким образом не получается, если не найду решения, придется эту часть из мануала убрать(
Спасибо за дополнение от другого плагина, буду вносить их в основной мануал.
Сначала эта часть в статье про произвольные поля меня порадовала. Я уж надеялся что в новых версиях вордпресса поддерживаются. Что это на моем "старике" не работает. А вот твой комментарий убил во мне надежду...
Но будем надеяться что команда вордпресс разработчиков сделает такой запрос в ядре. Это же сколько фильтров можно будет разных и интересных понаделать.
надежда должна умирать последней) и пока еще рановато для этого. Я посмотрю, что можно сделать в этом направлении, вполне возможно, что запрос с произвольными полями описывается просто по другому, хотя я изначально ориентировался на содержимое глобальной $query
И все-таки вариант использования произвольных полей при построении GET-запроса вполне жизнеспособен)
Например такой запрос работает:
codeseller.ru/?prodcat=besplatnye-plaginy&meta_key=price-products&orderby=meta_value&order=ASC
По нему получаем товары из товарной категории "Бесплатные плагины" и отсортировываем по по значению произвольного поля price-products по возрастанию цены. Так что пробуем дальше)
Что-то я не понял ничего:
- бесплатные и с ценой? Там или ноль или нет значения произвольного поля
Я пробывал у себя снова - не работает. У тебя здесь &meta_key=price-products&orderby=meta_value&order=ASC работает только сортировка &order=ASC а все что между категорией и &order=ASC - не влияет на выбор - попробуй /prodcat/besplatnye-plaginy/?order=asc - тоже самое
Да, все верно, ошибка с моей стороны. Видимо сильно хотел, чтобы все-таки заработало)))
Андрей, мануал хороший, только вот, все-таки, самая важная часть - поиск по произвольным полям, нет =( Вы можете создать мануал создания поиска по произвольным полям (я так понял это можно реализовать, но не через стандартные возможности wordpress)
здесь рассмотрена возможность обращения к БД через get-запрос, с произвольными полями так работать насколько я понял нельзя. Если и писать о поиске по ним, то только в рамках отдельной темы.
Думаю многим будет это интересно, тем более отдельной темой =)Ведь качественный поиск на сайте это залог успеха крупных порталов, которые также можно реализовывать на сайтах.
PS Вы получали мой "вопрос админу"?) Я хоть и читал, что если вы молчите, значит не заинтересовало, но все же...
Опубликовал статью с описанием поиска по произвольным полям. Если честно, то получая заявки с формы "Вопрос админу" я не вижу от кого они конкретно пришли, поэтому не могу вспомнить конкретно о вашем письме. Но вы правы, если я не ответил, значит, не ответил)
В итоге так и не понял, можно ли так работать с произвольными полями. Не хотелось бы создавать сложные формы. Мне нужны всего лишь ссылки, которые вставлю в стандартные поля меню.
Порядок формирования поискового фильтра с применением произвольных полей описан тут http://codeseller.ru/postroenie-filtra-zapisej-wordpress-po-proizvolnym-polyam-i-ne-tolko/
Как подобным способом сделать чтобы отображалось содержимое нескольких категорий, например /?cat=3,26. Вручную выходит, но фильтр не хочет выдавать такую ссылку даже если прописать атрибут - "multiple".
Попробовал сделать фильтрацию категорий чекбоксами, отметил две категории и вышло это: /?cat=3&cat=26. Как сделать чтобы выходило так: /?cat=3,26 .Подскажите пожалуйста, очень нужно.
Получить из фильтра get-запрос такого вида, описанным выше способом вряд ли получиться, как вариант вижу изменение параметров гет-запроса через init-экшны, тогда мы сможем получить нужные данные. Например, прописать что то типа этого:
function get_edit_get_request(){
if(isset($_GET['cat'])){
$cat = explode(',',$_GET['cat']);
$_GET['cat'] = $cat;
}
}
add_action('init','get_edit_get_request');
и вставить этот код в файл функций шаблона. А сами категории выводить через чекбоксы или выпадающие списки с параметром name="cat[]"
Сам не проверял, но логика вроде верная. Либо вам лучше обратить внимание на следующую статью, где рассказывается об организации поиска через POST-параметры.
Спасибо, буду пробовать.
Здравствуйте. А как насчет индексации? Поисковики будут такие страницы в индекс вгонять. Я бы хотел попробовать у себя на кулинарном.
С индексацией никаких проблем не будет, пробуйте.
Спасибо!
Добрый день! Помогите найти ошибку в коде
form action="/" method="get">
p>Укажите товарную категорию:
select name="prodcat">
option value="">--------
Праздник
option value="domashnie-zhivotnye">Домашние животные
/select>
p>Метка товара:
select name="tag">
--------
option value="otkrytki">Открытки
option value="myaso">Мясо
/select>
/p>
input type="submit" value="Получить записи">
/form>
по выводу результатов категорий проблем нет, но по меткам поиск не происходит.
при поиске по меткам происходит переход на адрес …./tag/otkrytki/?prodcat
а надо, чтобы …./tag/otkrytki/?post_type=products
как правильно сформировать запрос на поиск по меткам?
Заранее спасибо всем откликнувшимся.
Добрый день!
Подскажите, пожалуйста возможно ли огранизовать поиск-фильтр на сайте wordpress используя get и post запросы одновременно? То есть для одних парметров будет get-эти параметры будут отображаться в url (и в заголовке), а для других маловажных будет использоваться post запрос и их не будет видеть поисковая система.
Такая логика возможна?
PS Я не программист, но нужен ответ программиста)
это можно сделать, без php не обойтись.
можно еще так: form action="script.php?a=val_A&b=val_B" metod="post"
Здравствуйте подскажите пожалуйста products это родительская созданная рубрика, а books, clocks, glasses, scarfs это подрубрики?
У меня возник следующий вопрос.
Возможно ли в WordPress сделать некоторые страницы фильтров ЧПУ и открыть их для индексации? И как это сделать?
Например, если у меня магазин товаров, и я бы хотела продвигать страницы по запросу товар+бренд.
А всего имеется 50 разных видов товаров и у каждого по несколько брендов.
Как мне такое реализовать?
Заранее спасибо за ответ!
Помогите пожалуйста ,
фильтрация по категориям происходит успешно,
но по дате добавления(убыванию,возрастанию) ничего не происходит .
Что надо исправить ?
Исправляйте ошибку.
Раз уж вы такой находчивый , найдите пожалуйста причину ошибки. ❓
Кроме вас ее никто не сможет найти.