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

Сегодня я хочу рассказать вам, как сделать динамическую архивную страницу. "Динамическая" значит, что при выборе месяца, результаты будут показываться на той же странице, при помощи AJAX — технологии Javascript. Так как библиотека jQuery предоставляет удобный API по работе с Ajax, то будем использовать этот фреймворк. К тому же, куда сегодня без jQuery? Он ведь используется сплошь и рядом, и наверняка в вашем проекте он уже подключен.
Перед написанием этой статьи я сделал динамическую архивную страницу для этого блога, предлагаю взглянуть (ДЕМО).
Итак, чтобы реализовать динамический архив нам нужно пройти 4 этапа:
- Подключить jQuery;
- Загрузить картинку "ожидание загрузки" (ajax-loader.gif);
- Создать шаблон постоянной страницы, на которой будет выводиться архив;
- Создать файл-обработчик запроса ajax.
Я буду показывать создание динамической страницы архивов на примере базовой темы WordPress: "twentyten".
1. Подключение jQuery в WordPress
Если у вас еще не подключен jQuery, то сделать это можно в файле шаблона header.php. Внутри тега </head> вставляем такой html код:
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.0/jquery.min.js"></script>
Так, мы подключим jQuery из репозитории Google.
Если нужно подключить jQuery, который находится в WordPress (со своего сервера и с учетом что плагины тоже могут подключать jQuery), то вставляем такой код:
<?php wp_enqueue_script( 'jquery' ); ?>
Вставлять его нужно также в секцию </head>, но обязательно до вызова функции wp_head(), так как wp_enqueue_script( 'jquery' ); — это указание, чтобы wp_head() вывела ссылку на jQuery.
2. Загрузим картинку пред-загрузчик
В период ожидания, когда запрос отправляется серверу с помощью AJAX нам нужно показать картинку, уведомив пользователя, что что-то происходит. Такие картинки вы наверняка видели в сети и не раз, альтернативой такой картинки выступает текст: "Загрузка...".
Чтобы в дальнейшем у нас была такая картинка, давайте скачаем её, например, от сюда: Анимированные gif (сервис мне понравился), переименуем её в ajax-loader.gif и загрузим в папку images, которая находится в каталоге нашей темы WordPress. В итоге у нас получиться такой пусть до картинки: http://site.ru/wp-content/themes/twentyten/images/ajax-loader.gif. Ниже мы его используем в коде.
3. Создание шаблона постоянной страницы
Для постоянных страниц в WordPress можно использовать отдельные шаблоны, таким образом мы можем создать страницу совершенно отличающуюся по структуре от остальных страниц. Чтобы указать WordPress, что созданный нами файл является шаблоном для постоянной страницы, в начало этого файла нужно прописать такой код:
<?php /* Template Name: Шаблон архивов */ ?>
"Шаблон архивов" — это название нашего шаблона, которое мы увидим в админ-панели WordPress, при создании постоянной страницы.
Давайте создадим новый файл в папке темы, с названием tpl_archive.php и вставим туда вышеприведенный код. Затем зайдем в админ-панель WordPress и создадим постоянную страницу, назначив ей, только что созданный, шаблон.

Теперь, заполним этот файл необходимым кодом.
1. В первую очередь, нам нужно вывести выпадающие списки, создадим мы их с помощью функций WordPress: wp_get_archives() и wp_dropdown_categories():
<?php
/*
Template Name: Шаблон архивов
*/
?>
<?php get_header(); ?>
<div id="archive_browser">
<div>
<h4>Месяцы</h4>
<select id="month-choice">
<option val="no-choice"> — </option>
<?php wp_get_archives(array(
'type' => 'monthly',
'format' => 'option'
)); ?>
</select>
</div>
<div>
<h4>Рубрики</h4>
<?php wp_dropdown_categories('show_option_none= -- '); ?>
</div>
</div>
<div id='archive_pot'></div>
<?php get_footer(); ?>
get_header(); и get_footer(); получают шапку и подвал шаблона соответственно. get_sidebar(); я вырезал намеренно, чтобы он не мешался в понимании кода. Остальная часть кода выводит выпадающие списки Месяцев и Рубрик.
Пустой блок <div id='archive_pot'></div> — это контейнер куда будут выводится результаты запроса, т.е. записи.
2. Оформим выпадающие списки через CSS, для этого добавим такой код сразу после вызова шапки (<?php get_header(); ?>):
<style type="text/css" rel="stylesheet" >
#archive_browser > div { display: inline-block; padding-right: 10px; }
#archive_pot { min-height:150px; }
#archives_table { border-collapse:collapse; margin:15px 0 0 0; width:100%; }
#archives_table td { min-height:25px; padding:4px; border-top:1px solid #eee; border-bottom:1px solid #eee; }
</style>
На этом этапе у меня получилось следующее:

3. Добавим JavaScript код, который будет выполнять запрос к серверу и выводить его в блок archive_pot (код добавляем после css стилей):
<script type="text/javascript">
(function($){
$(function(){
$("#archive_browser select").change(function(){
$("#archive_pot")
.empty()
.html("<div style='text-align:center; padding:30px;'><img src='<?php bloginfo('template_url') ?>/images/ajax-loader.gif' /></div>");
var dateArray = $("#month-choice").val().split("/");
var y = dateArray[3];
var m = dateArray[4];
var c = $("#cat").val();
$.post(
"<?php bloginfo('template_url') ?>/scripts/archive_getter.php",
{
year : y,
month : m,
cat : c
},
function(data) {
$("#archive_pot").html(data).animate({ height: $("#archives_table").height()+40 });
}
);
});
});
})(jQuery)
</script>
Разберем немного код:
Все что внутри $("#archive_browser select").change(function(){...} будет срабатывать при изменении выпадающих списков.
<?php bloginfo('template_url') ?>/images/ajax-loader.gif — путь до файла-картинки (загрузка...), которая будет подгружаться в период запроса.
<?php bloginfo('template_url') ?>/scripts/archive_getter.php — путь до файла обработчика запроса, который мы создадим на следующем этапе.
$.post(...); — Функция jQuery, создающая запрос браузера к серверу, используя AJAX технологию.
Полные код шаблона постоянной страницы
Файл шаблона постоянной страницы (создаем файл в папке темы и копируем туда этот код):
<?php
/*
Template Name: Шаблон архивов
*/
?>
<?php get_header(); ?>
<style type="text/css" rel="stylesheet" >
#archive_browser > div { display: inline-block; padding-right: 10px; }
#archive_pot { min-height:150px; }
#archives_table { border-collapse:collapse; margin:15px 0 0 0; width:100%; }
#archives_table td { min-height:25px; padding:4px; border-top:1px solid #eee; border-bottom:1px solid #eee; }
</style>
<script type="text/javascript">
(function($){
$(function(){
$("#archive_browser select").change(function(){
$("#archive_pot")
.empty()
.html("<div style='text-align:center; padding:30px;'><img src='<?php bloginfo('template_url') ?>/images/ajax-loader.gif' /></div>");
var dateArray = $("#month-choice").val().split("/");
var y = dateArray[3];
var m = dateArray[4];
var c = $("#cat").val();
$.post(
"<?php bloginfo('template_url') ?>/scripts/archive_getter.php",
{
year : y,
month : m,
cat : c
},
function(data) {
$("#archive_pot").html(data).animate({ height: $("#archives_table").height()+40 });
}
);
});
});
})(jQuery)
</script>
<div id="archive_browser">
<div>
<h4>Месяцы</h4>
<select id="month-choice">
<option val="no-choice"> — </option>
<?php wp_get_archives(array(
'type' => 'monthly',
'format' => 'option'
)); ?>
</select>
</div>
<div>
<h4>Рубрики</h4>
<?php wp_dropdown_categories('show_option_none= -- '); ?>
</div>
</div>
<div id='archive_pot'></div>
<?php get_footer(); ?>
4. Создание файла-обработчика
AJAX подразумевает "общение" браузера с сервером без перезагрузки страницы, средствами Javascript. Скрипт сам по себе не может получить никаких данных, ведь он находится на компьютере пользователя, а данные на сервере, поэтому чтобы скрипт получил данные он должен обратится к серверу, в данном случае такой диалог будет поддерживать файл-обработчик.
Давайте создадим папку scripts в каталоге темы, в ней создадим файл archive_getter.php (/wp-content/themes/twentyten/scripts/archive_getter.php) и заполним этот файл следующим кодом:
<?php
// подгружаем среду WP
require($_SERVER['DOCUMENT_ROOT'].'/wp-load.php');
// фильтруем POST данные, передаваемые этому файлу с Javascript
$year = htmlspecialchars(trim($_POST['year']));
$month = htmlspecialchars(trim($_POST['month']));
$cat = htmlspecialchars(trim($_POST['cat']));
?>
<table id="archives_table">
<?php
if( ($year=='') && ($month=='') && ($cat=='-1') ){
echo "<tr><td style='text-align: center; font-size: 15px; padding: 5px;'>Пожалуйста, выберите дату/категорию из списка выше.</td></tr>";
}
else
{
// Получаем данные с помощью query_posts
query_posts("posts_per_page=-1&cat=$cat&monthnum=$month&year=$year");
// выводим данные в Цикле WordPress
if( have_posts() ){ while( have_posts() ){ the_post(); ?>
<tr>
<td><a href='<?php the_permalink(); ?>'><?php the_title(); ?></a></td>
<td><?php comments_popup_link(' ', '1 Комментарий', '% Комментариев'); ?></td>
<td><?php the_time('j.m.Y'); ?></td>
</tr>
<?php
}}
else // Если постов нет
echo "<tr><td style='text-align: center; font-size: 15px; padding: 5px;'>Ничего не найдено.</td></tr>";
} ?>
</table>
Небольшой разбор кода:
Сначала мы подгружаем среду WordPress (все настройки, функции, плагины). Делается это для того, чтобы нам стали доступны функции WordPress, в частности query_posts(), которую мы используем в этом файле для получения данных.
Условием if( ($year=='') && ($month=='') && ($cat=='-1') ){...} мы проверяем существуют ли какие-либо данные, которые мы позднее можем использовать в функции query_posts(), если дынных нет, то выводим сообщение.
query_posts("posts_per_page=-1&cat=$cat&monthnum=$month&year=$year"); и все что ниже это привычный Цикл WordPress.
Вот и все, страница готова!
Вот что у меня получилось (правда, это всего-лишь картинка. Живой пример см. здесь):

- Предыдущие по меткам
- Предыдущие записи
- Что такое цикл the loop в WordPress ← 20.Июл.2010 // 14
- Самые Хлебные крошки (breabcrumbs для WordPress) ← 19 Апрель 2011 // 81
- Плагин для подсчета количества загрузок файла – Kama’s Click Counter ← 28 Март 2011 // 45
- Нумерация комментариев в WordPress ← 12 Март 2011 // 44
Пардон, это у меня ошибка в шаблоне была.
У тебя на сайте реализовано еще и разбивка по типам , можешь показать код?
А за труды твои тебе человеческое спасибо
А насколько ресурсозатратен этот способ?
Я с помощью этого способа сделал расширенный фильтр поиска, а на другой странице вывод php кода в личном профиле(пользовательские закладки и история просмотра) (на аяксе потому что браузеры при возвращении на страницу профиля показывают неактуальную информацию... F5 постоянно нажимать надо...) .Теперь вот опасаюсь что будет сильная нагрузка на хостинг. Проверить сам не могу - статистика недоступна. А в футере мегабайты не меняются - это внутри как-то смотреть нужно.
Спасибо за реализацию и отличное описание. Может не внимательно читал, но скрипт работает только если включить в админке - постоянные ссылки, вида - "День и название"(http://твойсайт.by/2011/12/23/sample-post/), или "Месяц и название"(http://твойсайт.by/2011/12/sample-post/). Т.е если вы используете другой вид ЧУП ссылок, сортировка по месяцам будет недоступна, будьте внимательны.
Спасибо за информацию!
А это код можно использовать в случае чекбокосов?