Продолжая тему, посвященную плагину Magic Fields, я постараюсь доступно рассказать о том, как организовать поиск по дополнительным полям, которые создаются с помощью этого плагина. Помимо процесса создания привычной поисковой формы, приведу пример организации одиночных фильтров.
И то и другое, в готовом варианте, вы можете видеть в блоге, который я уже упоминал в первой заметке о Magic Fields. К сожалению, с тех пор я так и не удосужился уделить этому блогу сколько-нибудь достаточное количество времени, поэтому и форма и фильтры там находятся в зачаточном состоянии. Тем не менее, они отлично демонстрируют результат, являющийся логичным завершением использования данного WordPress плагина.
Единственным минусом плагина Magic Fields является невозможность создавать поля с парами ключ – значение. Быть может для вас это и не является минусом, но мне данный подход не слишком нравится. В любом случае, вариантов нет, поэтому мы будем фильтровать публикации в каталоге по строковым значениям дополнительных полей.
Допустим, помимо прочих, у нас есть дополнительное поле «Производитель». Список производителей строго регламентирован и при создании публикации он представляет собой selectbox. В пользовательской части наша публикации может иметь следующий вид (скриншот с упомянутого блога):

Все характеристики заданы дополнительным полями Magic Fields. Те значения, что подсвечиваются синим цветом являются ссылками, выполняющими роль фильтров.
Предположим, что мы кликаем на имя производителя LG и, перейдя обратно в каталог, хотим видеть товары только этой компании. Для реализации этой нехитрой логики открываем файл шаблона header.php и дописываем туда следующий код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <?php if (is_category(3) || in_category(3) && !is_home() && !is_single()) { $x_params = array(); if (isset($_REQUEST["device_type"]) && $_REQUEST["device_type"] != '') { $x_params['x_device_type'] = $_REQUEST["device_type"]; } if (isset($_REQUEST["device_producer"]) && $_REQUEST["device_producer"] != '') { $x_params['x_device_producer'] = $_REQUEST["device_producer"]; } if (isset($_REQUEST["device_os"]) && $_REQUEST["device_os"] != '') { $x_params['x_device_os'] = $_REQUEST["device_os"]; } if (sizeof($x_params)) { global $query_string; $x_string = null; foreach ($x_params as $key => $value) { $x_string .= '&' . $key . '=' . $value; } query_posts($query_string . $x_string); } } ?> |
Код простой и не требует каких-то особых комментариев, кроме отдельных моментов.
Первый условный оператор банально предотвращает обработку данного кода вне требуемой категории. По моим планам, плагин должен был работать лишь для одной категории – устройства. В ней же мы фильтруем позиции, осуществляем поиск по дополнительным полям и прочему. Следовательно, нет смысла пытаться получить значения фильтров в других категориях. Из этих же соображений можно было вынести данный код в шаблон вывода постов, так как для страниц, например, он уже не актуален. Но я влепил его в header.php и так он там и остался.
Далее собираем все полученные значения дополнительных полей в массив $x_params. Если полей будет очень много, то не следует делать так, как сделал я, а именно писать блок условия для каждого поля. Иначе у вас будет много некрасивого и бестолкового кода. Лучше вынести имена полей в массив, а затем обходить его циклом, проверяя, пришло ли от пользователя значение для каждого поля. Но речь не об этом.
Собрали все значения в массив ключ =>значение и циклом конкатенируем их в строку вида &x_field_name=field_value. Обратите внимание, на то, что имена дополнительных полей должны иметь префикс x_. После этого регистрируем наш обновленный запрос функцией query_posts(). Естественно, не забываем выполнить конкатенацию уже существующей строки запроса, которая храниться в переменной $query_string и наших добавленных параметров.
Собственно, на этом все. Если вы действовали согласно приведенному примеру, то должны получить желаемый результат. Код выше позволяет одинаково успешно использовать как фильтрацию по каждому отдельному полю, так и поисковую форму, которая будет задавать несколько параметров выборки одновременно.
Ниже привожу код, который будет выводить форму поиска по дополнительным полям Magic Fields. У меня она лежит в файле шаблона archive.php, но не факт, что у вас также (зависит от шаблона и способов его реализации).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | <?php if (in_category(3)) { $device_producers = array( 'HTC', 'Sony Ericsson', 'Sumsung', 'Motorola', 'Wexler' ); ?> <form method="post" action="/devices/"> <table> <tr> <td>Производитель:</td> <td> <select name="device_producer"> <option value="">-</option> <?php foreach($device_producers as $d_producer) { ?> <option<? if (@$_REQUEST["device_producer"] == $d_producer) echo ' selected="selected"'; ?> value="<?=$d_producer?>"><?=$d_producer?></option> <? } ?> </select> </td> </tr> <tr> <td colspan="2"><input type="submit" value="Показать" /></td> </tr> </table> </form> <? } ?> |
У меня в блоге, на момент написания статьи, она выглядела примерно так:

В общем, Magic Fields – действительно отличный WordPress плагин, позволяющий значительно расширять возможности стандартного блога. Потенциал у него достаточно большой и при желании, можно структурировать неплохой каталог со всеми необходимыми функциями.
Успехов!
P.S: Пример реализации поиска с помощью класса WP_Query
А могли бы Вы привести реализацию фильтра (поиска) по выборке записей с различными видами, а не только с полем select, но и с checkbox-ами, полями ввода (например для мин. и макс. цены) и чтобы они были взаимодополняющими. Например выбор нескольких типов производителей.
То, о чем вы спрашиваете, больше относится к API WordPress и прямого отношения к плагину не имеет.
Но учитывая тот факт, что подобный вопрос задаете не вы первый, ближайшее время постараюсь написать небольшую заметку на эту тему.
буду очень признателен, если уведомите о этой заметке по мылу;)
Я бы предложил вам подписаться на RSS :) про мыло, скорее всего, банально забуду.
Ко всему прочему, время от времени пишу о WordPress. Возможно, другие заметки тоже будут вам интересны.
Заметка «Поиск по произвольным полям с помощью класса WP_Query»
Большое спасибо за материал! Как раз нужен каталог для WordPress