Еще один способ отображения архива постов

Архивы постов WordPressПрошло уже почти две недели как я ничего не писал в блог, могло показаться, что я забросил это дело, но нет… Все это время я изучал  мастерство “плагинописания”. :-) И вот результат – “сАвсЭм маленький, но очень гордый” :-) плагин 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(); } 
?>

Ссылки:

Комментарии:

  1. Денис

    мне кажется, что первый вид более приятный для человеческого восприятия, тем более, если то относится к блогу!

  2. Diz

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

газобетон