Еще один способ отображения архива постов
Прошло уже почти две недели как я ничего не писал в блог, могло показаться, что я забросил это дело, но нет… Все это время я изучал мастерство “плагинописания”.
И вот результат – “сАвсЭм маленький, но очень гордый”
плагин wp-display-archives, использующий ajax.
Все прекрасно знают что такое архив постов и зачем он нужен. Мало кто из блоггеров не пользуется им. Архив обычно визуализируется либо как список ссылок (<ul>) с разбиением по месяцам и годам, либо в виде выпадающего меню (<select>), реже но встречаются еще и в виде дерева. Я хочу рассмотреть его реализацию в виде двух выпадающих списков (два <select>). Что бы дальше стало понятно, о чем идет речь – глянем на картинку, на которой продемонстрированы распространенные способы отображения архива и способ предложенный мною (пункт 3):

1-й способ реализуется вызовом функции:
1 | <?php wp_get_archives(); ?> |
без каких-либо параметров. Генерируется список, где каждая ссылка – архив за определенный месяц. Все красиво и очень наглядно. Минус – со временем количество ссылок увеличивается, приходится лимитировать вывод.
2-й способ реализуется той же самой функцией, но только приправляется тэгами:
1 2 3 4 | <select onChange='document.location.href=this.options[this.selectedIndex].value;'> <option value=""><?php echo('Выбрать месяц'); ?></option> <?php wp_get_archives('type=monthly&format=option&show_post_count=1'); ?> </select> |
В этом случае передаются параметры: type=monthly – выводить по месяцам, format=option – указывается что архивы будут выводиться как <option> элементы тэга <select>, show_post_count=1 – отображать количество постов в каждом месяце. При выборе нужного месяца и года во всплывающем списке происходит переход на страницу архива. Такое представление очень компактно, но присутствует дублирование по годам (т.е. рядом с каждым месяцем выводится и год, которому он относится).
3-й способ, мой – два выпадающих списка: в одном годы, в другом месяцы, при выборе года динамически (без перезагрузки страницы) подгружаются месяца и количество постов в них.
Цель: Реализуем 3-й способ с помощью библиотеки jquery и оформим его в виде плагина к WordPress.
Детали реализации:
Как подключать jquery я уже рассказывал в статье о вставке ajax формы в любой пост (запись). Исходный код плагина:
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | <?php /* Plugin Name: Display archives as two select Description: Плагин отображает архив постов в виде 2-х раскрывающихся списков выбора Version: 1.0 Author: Diz Author URI: http://diz-blog.com.ua/ */ function wp_display_archives_months_list($wp) { global $wpdb; $months_list=array(1=>'Январь',2=>'Февраль',3=>'Март',4=>'Апрель',5=>'Май',6=>'Июнь',7=>'Июль',8=>'Август',9=>'Сентябрь',10=>'Октябрь',11=>'Ноябрь',12=>'Декабрь'); if (isset($_GET['year'])) { $_GET['year']=(int)$_GET['year']; $months_of_archive = $wpdb->get_results("SELECT DISTINCT MONTH ($wpdb->posts.post_date) as `month`, COUNT(*) as `count_of_posts` FROM $wpdb->posts WHERE YEAR($wpdb->posts.post_date) = ".$_GET['year']." AND $wpdb->posts.post_status = 'publish' AND $wpdb->posts.post_type = 'post' GROUP BY MONTH ($wpdb->posts.post_date)"); if ($months_of_archive) { ?> <select name="months" onChange='document.location.href=this.options[this.selectedIndex].value;'> <option value="">Выберите месяц</option> <?php foreach ($months_of_archive as $m_o_a) { ?> <option value="<?php echo(get_month_link($_GET['year'],$m_o_a->month));?>"><?php echo ($months_list[$m_o_a->month]." (".$m_o_a->count_of_posts.")");?></option> <?php } ?> </select> <?php } die(); } } add_action('wp', 'wp_display_archives_months_list'); function wp_display_archives_years_list() { global $wpdb; $years_of_archive = $wpdb->get_results("SELECT DISTINCT YEAR($wpdb->posts.post_date) as `year` FROM $wpdb->posts WHERE $wpdb->posts.post_status = 'publish' AND $wpdb->posts.post_type = 'post'"); if ($years_of_archive) { ?> <script type="text/javascript"> // <![CDATA[ function get_months_list() { var str = jQuery("#display_archives").serialize(); jQuery.get('<?php echo(get_bloginfo('wpurl')); ?>', str, function(data) { jQuery("#months_div").html(data); }); //alert('<?php echo(get_bloginfo('wpurl')); ?>'); } // ]]> </script> <form id="display_archives"> <div id="years_div" align='center'> <select name="year" onChange="if (this.options[this.selectedIndex].value != '') {get_months_list(); return false;}"> <option value="">Выберите год</option> <?php foreach ($years_of_archive as $y_o_a) { ?><option value="<?php echo ($y_o_a->year);?>"><?php echo ($y_o_a->year);?></option> <?php } ?> </select> </div> <div id="months_div" align='center'><br></div> </form> <?php } } ?> |
Разберем некоторые нюансы реализации. Плагин состоит их двух функций: wp_display_archives_months_list() – отображает список месяцев,
wp_display_archives_years_list() – отображает список годов.
После того как посетитель выбрал год, выполняется ajax-запрос методом GET к серверу и управление получает первая функция, которая производит выборку месяцев из базы, согласно указанному году, возвращая их в виде <select>. Браузер получив эти данные, генерирует html-код.
Скачать плагин WP-DISPLAY-ARCHIVES
Инсталляция плагина: Сохраняем архив себе на диск, распаковываем и как обычно – кладем в папку \plugins\, в админке активируем плагин и в шаблоне в нужном месте (я вставил в sidebar.php) помещаем код:
1 2 3 4 | <?php if ( function_exists('wp_display_archives_years_list') ) {wp_display_archives_years_list(); } ?> |
Ссылки:




мне кажется, что первый вид более приятный для человеческого восприятия, тем более, если то относится к блогу!
Безусловно! Но когда блог существует достаточно долго и содержит большое количество постов, то архив начинает занимать много места в сайдбаре.