Сортировка записей в WordPress

Изначально Wordpress — конечно же блог. И хоть приспособить эту систему управления содержимым можно под что угодно — от сайта-визитки до интернет-магазина, но по умолчанию все записи в нём выводятся в хронологическом порядке. А если нужно по алфавиту? Давайте программировать!

Правда же, это относительно легко, и даже при минимуме знаний вполне осуществимо. Главное — внимательность. Готовы? Поехали!

Механизм

Сначала продумаем принцип работы сортировки. В файле заголовка вашей темы (header.php, его можно редактировать хоть встроенными средствами WP, хоть непосредственно файл внешним редактором) до закрывающего тега </head> понадобится фрагмент кода, который будет отвечать за сортировку, то есть что-то модифицирует запрос на вывод записей, и конечно же, где-то нужно будет вставить саму кнопку сортировки. Предлагаю сделать это в сайдбаре — так и безопаснее: не нужно редактировать никаких других файлов.

Теперь о деталях.

Наверняка в вашем сайте записей накопилось (или накопится) на несколько страниц, поэтому при пролистывании порядок сортировки должен сохраняться. Передавать параметры между страницами при переходе — скучно и неудобно, к тому же для отдельного пользователя порядок сортировки для удобства можно и сохранить на несколько дней. Логичнее всего здесь будет использовать куки.

Для сортировки записей совершенно не стоит делать повторный запрос к базе данных, достаточно до начала основного добавить в него ещё один параметр: по какому полю сортировать. Забегая вперёд скажу, что так можно сортировать и по произвольным полям.

Код в студию!

Итак, для приготовления этого блюда нам потребуется два фрагмента кода: для сайдбара и для заголовка. Рассматривать алгоритм удобно на готовом примере. Начнём с заголовочного:

<?php
global $query_string;
$kukushka = @$_COOKIE['myblogsortorder'];
if ($kukushka == "namedesc") {
	query_posts($query_string . "&orderby=title&order=DESC");
} elseif ($kukushka == "nameasc") {
	query_posts($query_string . "&orderby=title&order=ASC");
};
?>

Здесь мы в переменную, которую я нежно назвал $kukushka, вытягиваем значение куки с именем myblogsortorder. В зависимости от её значения (namedesc или nameasc) мы изменяем в глобальной переменной $query_string концовку, где указываем поле для сортировки (title) и порядок (DESC или ASC — нисходящий или восходящий).

Тут становится понятно, что если понадобится, скажем, отсортировать по дате, — нужно будет вместо title задать date (о других параметрах можно почитать на сайте Wordpress).

Итак, вставляем этот фрагмент в header.php перед тегом </head>. Почему там? Во-первых, наверняка цикл вывода записей там ещё не начался, во-вторых — эту сортировку не нужно будет повторять во всех шаблонах: архива, поиска, категорий… Но если вам нужно будет сортировать, например, только результаты поиска — тогда конечно сделать это нужно будет в самом начале search.php.

Сохраняем шаблон и пробуем. Ничего не произошло? Как и раньше работает? Значит, пока всё идёт правильно. А чтобы появилась сортировка, нужно добавить кнопки управления куками. Для этого я использую Executable php widget — в отличие от обычного, он может обрабатывать и php код. Впрочем, и простой текстовый виджет может обработать html, а больше нам и не надо: там будет чуть-чуть javascript’а.

Вставляем в сайдбар:

<script>
function setCookie(name, value, days) { 
	if (days) { 
	var date = new Date(); 
	date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); 
	var expires = "; expires=" + date.toGMTString(); 
	} 
	else var expires = ""; 
	document.cookie = name + "=" + value + expires + "; path=/"; 
	document.location.href = document.location.href;
} 
function eraseCookie(name) { 
	setCookie(name, "", -1); 
	document.location.href = document.location.href;
}; 
</script>
<input type="button" onclick="setCookie('myblogsortorder', 'nameasc', 1);" value="По наименованию (А-я)" />
<input type="button" onclick="setCookie('myblogsortorder', 'namedesc', 1);" value="По наименованию (Я-а)" />
<input type="button" onclick="eraseCookie('myblogsortorder')" value="Очистить фильтр" />

Что это всё делает? Функции создают и уничтожают куки. Две первые кнопки изменяют значение куки myblogsortorder на nameasc или namedesc; третья — удаляет куки. Кроме того, в обеих функциях обработки куки последняя строка перезагружает документ, чтобы сортировка вступила в силу (WP должен заново сгенерировать поток записей).

Теоретически строки:

document.location.href = document.location.href;

должны работать, но у меня так было не везде. Другой их вариант может быть таким:

location.reload();

тут уж у кого как пойдёт. Хотя первый вариант правильнее.

Сортировка по произвольным полям

Допустим, у вас планируется интернет-магазин, и первый же вопрос — отсортировать по цене. Реализуется это просто: одно из произвольных полей отводится под значение цены (в этом примере назовём его price), остаётся его только где-то вывести (нужно дописать его вывод в шаблонах), и создать механизм сортировки.

Будет ли работать приведённая выше пара фрагментов кода? Конечно! Нужно только в сайдбаре сделать ещё пару кнопок:

<input type="button" onclick="setCookie('myblogsortorder', 'priceasc', 1);" value="По цене (1-10)" />
<input type="button" onclick="setCookie('myblogsortorder', 'pricedesc', 1);" value="По цене (10-1)" />

а в шапке дополнить, чтобы вышло вот так:

<?php
global $query_string;
$kukushka = @$_COOKIE['myblogsortorder'];
if ($kukushka == "namedesc") {
	query_posts($query_string . "&orderby=title&order=DESC");
} elseif ($kukushka == "nameasc") {
	query_posts($query_string . "&orderby=title&order=ASC");
} elseif ($kukushka == "pricedesc") {
	query_posts($query_string . "&orderby=price&order=DESC");
} elseif ($kukushka == "priceasc") {
	query_posts($query_string . "&orderby=price&order=ASC");
};
?>

И будет счастье!

Надеюсь, здесь вы нашли ответ на интересующий вас вопрос.


Protected by Copyscape Online Plagiarism Test
Вы не можете высказаться или оставить ссылку здесь...

Обсуждение закрыто.

Powered by WordPress | Thanks to NewWpThemes | Александр Божок