Динамічний архів блогу з використанням jQuery (Ajax)
Усі ми бачили архіви, у яких при виборі місяця нас перекидало на сторінку із записами за цей місяць. У WordPress такий висновок архівних посилань реалізується за допомогою функції wp_get_archives() . Аналогічний архів записів виходить при виведенні звичайних рубрик WordPress, тільки записи групуються за категоріями.
Сьогодні я хочу розповісти вам, як зробити динамічну архівну сторінку . “Динамічна” означає, що при виборі місяця результати будуть показуватися на тій же сторінці , за допомогою AJAX – технології Javascript. Оскільки бібліотека jQuery надає зручний API для роботи з Ajax, то будемо використовувати цей фреймворк. До того ж, куди сьогодні без jQuery? Адже він використовується часто-густо, і напевно у вашому проекті він вже підключений.
Перед написанням цієї статті я зробив динамічну архівну сторінку для цього блогу, пропоную подивитись (ДЕМО) .
Отже.
Щоб реалізувати динамічний архів, нам потрібно пройти 4 етапи:
Я показуватиму створення динамічної сторінки архівів на прикладі базової теми WordPress: “twentyten”.
1. Підключення jQuery у WordPress
Правильний варіант підключення jQuery скрипта – це використання функції wp_enqueue_script() . Таке підключення убезпечить вас від конфліктів із підключенням цього ж скрипту в плагінах. Скрипт буде підключено один раз.
<?php add_action( 'wp_enqueue_scripts', 'my_scripts_method' ); function my_scripts_method(){ wp_enqueue_script('jquery'); } ?>
Вставляти цей код потрібно у файл теми functions.php.
Варіант 2
У першому варіанті ми підключили скрипт із нашого сервера, який є у файлах WordPress. Однак, можна змінити посилання на файл jQuery та підключити його до CDN Google. Перевага такого підходу в тому, що якщо у браузері відвідувача вже завантажено цей файл, то при заході на ваш сайт браузер вже не завантажуватиме скрипт/ Завантаження сторінки збільшиться. Крім того, CDN скрипт віддається в стислому вигляді, за рахунок чого файл легше на кілька кілобайт:
function my_scripts_method() { wp_deregister_script('jquery'); wp_register_script( 'jquery', '//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js'); wp_enqueue_script('jquery'); } add_action( 'wp_enqueue_scripts', 'my_scripts_method' );
Варіант 3
Найдавніший і так званий “жорсткий” варіант підключення jQuery – це прописати посилання на нього у файлі шаблону header.php
, всередині тега </head>
. Вставляємо такий html код:
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
2. Завантажимо картинку перед-завантажувач
У період очікування, коли запит надсилається серверу за допомогою AJAX, нам потрібно показати картинку, повідомивши користувача, що щось відбувається. Такі картинки ви, напевно, бачили в мережі і не раз, альтернативою такої картинки виступає текст: “Завантаження…”.
Щоб надалі у нас була така картинка, давайте скачаємо її, наприклад, від сюди: Анімовані gif (сервіс мені сподобався), перейменуємо її ajax-loader.gif
і завантажимо в папку images
, яка знаходиться в каталозі нашої теми WordPress. У результаті ми маємо такий нехай до картинки: http://example.com/wp-content/themes/twentyten/images/ajax-loader.gif
. Нижче ми його використовуємо у коді.
3. Створення шаблону постійної сторінки
Для постійних сторінок у WordPress можна використовувати окремі шаблони, таким чином ми можемо створити сторінку, яка зовсім відрізняється від структури від інших сторінок. Щоб вказати WordPress, що створений файл є шаблоном для постійної сторінки, на початок цього файлу потрібно прописати такий код:
<?php /* Template Name: Шаблон архівів */ ?>
Шаблон архівів – це назва нашого шаблону, яку ми побачимо в адмін-панелі WordPress, при створенні постійної сторінки.
Давайте створимо новий файл у папці теми з назвою tpl_archive.php
і вставимо туди вищенаведений код. Потім зайдемо в адмін-панель WordPress і створимо постійну сторінку, призначивши їй, щойно створений шаблон.
Тепер заповнимо цей файл необхідним кодом.
1. В першу чергу, нам потрібно вивести списки , що випадають, створимо ми їх за допомогою функцій WordPress: 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('jmY'); ?></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 .
Ось і все, сторінка готова!
Ось що в мене вийшло (правда, це всього лише картинка. Живий приклад див. тут ):