Каталог на WordPress + Magic Fields. Поиск по каталогу и фильтры. Часть 2

14 февраля 2012

Продолжая тему, посвященную плагину Magic Fields, я постараюсь доступно рассказать о том, как организовать поиск по дополнительным полям, которые создаются с помощью этого плагина. Помимо процесса создания привычной поисковой формы, приведу пример организации одиночных фильтров.

И то и другое, в готовом варианте, вы можете видеть в блоге, который я уже упоминал в первой заметке о Magic Fields. К сожалению, с тех пор я так и не удосужился уделить этому блогу сколько-нибудь достаточное количество времени, поэтому и форма и фильтры там находятся в зачаточном состоянии. Тем не менее, они отлично демонстрируют результат, являющийся логичным завершением использования данного WordPress плагина.

Единственным минусом плагина Magic Fields является невозможность создавать поля с парами ключ – значение. Быть может для вас это и не является минусом, но мне данный подход не слишком нравится. В любом случае, вариантов нет, поэтому мы будем фильтровать публикации в каталоге по строковым значениям дополнительных полей.

Допустим, помимо прочих, у нас есть дополнительное поле «Производитель». Список производителей строго регламентирован и при создании публикации он представляет собой selectbox. В пользовательской части наша публикации может иметь следующий вид (скриншот с упомянутого блога):

Элемент каталога на WordPress

Все характеристики заданы дополнительным полями 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

Категория: WordPress

Мурашов Олег

Программист и фрилансер из Санкт-Петербурга. Помимо веб-программирования, занимаюсь разработкой мобильных приложений для платформы Android. Играю на бас гитаре. Занимаюсь спортом.

6 Responses to Каталог на WordPress + Magic Fields. Поиск по каталогу и фильтры. Часть 2

  1. rom says:

    А могли бы Вы привести реализацию фильтра (поиска) по выборке записей с различными видами, а не только с полем select, но и с checkbox-ами, полями ввода (например для мин. и макс. цены) и чтобы они были взаимодополняющими. Например выбор нескольких типов производителей.

  2. Михаил says:

    Большое спасибо за материал! Как раз нужен каталог для WordPress

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*