WordPress как на ладони
Очень Удобный и Быстрый Хостинг для сайтов на WordPress. Пользуюсь сам и вам рекомендую!

Функция вывода всех постов по месяцам написания

Надеюсь, я вам еще не надоел своими функциями.

В этом посте я поведу очередное повествование о функции вывода в WordPress, правда, на этот раз функция совсем даже не моя, а автора темы Blix Theme, функция переросла из темы в плагин, стараниями автора блога rmarsh.com, который выдрал вышеупомянутую из темы и сделал плагин с названием «Blix Archive».

Как Dimox нашел этот плагин, я не имею ни малейшего понятия, Дима – золотоискатель smile «Причем здесь Dimox» - спросите вы? «Как причем?» - отвечу я. Ведь именно он, когда-то давно, дал мне ссылку на этот плагин, после того как я, будучи зеленым ковырятелем WordPress обратился к «гуру в веб-разработке» Dimox’у, показать код его карты сайта. Кстати, кто не знаком с Димой и его отличным блогом срочно знакомимся.

После того, как Дима услужливо направил меня по ссылке, где я скачал плагин я вернул все на места своя – похоронил плагин, предварительно вытащив из него функцию вывода, которой сейчас с вами и поделюсь.

Такова история нижеприведенной функции и этого поста wink

Ну, а теперь к делу.

Функция, которую я собираюсь представить, выводит посты, группируя их по месяцу написания, и выглядит это как-то так:

Функция вывода всех постов по месяцу написания

А сама функция выглядит именно так:

/**
 * Функция вывода постов по месяцу.
 *
 * @param int    $show_comment_count Показывать ли колличество комментариев. 1 - показывать.
 * @param string $before             ('<h4>') HTML тег до заголовка (названия месяца).
 * @param string $after              ('</h4>') HTML тег после заголовка.
 * @param string $year               (0) Огриничить вывод годом. Если указать 2009, будут выведены записи за 2009 год по месяцам
 * @param string $post_type          ('post') Тип поста. Если нужно вывести нестандартный тип постов (отличный от post)
 * @param int    $limit              (100) Ограничение количества выводиммых постов для каждого месяца.
 *                                   При большой базе, создается сильная нагрузка. Укажите 0 если нужно снять ограничение
 *
 * Пример вызова:
 *     <php echo get_blix_archive(1, '<h4>', '</h4>'); ?>
 */
function get_blix_archive( $show_comment_count = 0, $before = '<h4>', $after = '</h4>', $year = 0, $post_type = 'post', $limit = 100 ) {
	global $month, $wpdb;

	$result = '';

	$AND_year = $year ? $wpdb->prepare( " AND YEAR(post_date) = %s", $year ) : '';
	$LIMIT = $limit ? $wpdb->prepare( " LIMIT %d", $limit ) : '';
	$post_type = esc_sql( $post_type );

	$arcresults = $wpdb->get_results( "
		SELECT DISTINCT YEAR(post_date) AS year, MONTH(post_date) AS month, count(ID) as posts FROM $wpdb->posts
		WHERE post_type='$post_type' $AND_year AND post_status='publish'
		GROUP BY YEAR(post_date), MONTH(post_date)
		ORDER BY post_date DESC
	" );

	if( ! $arcresults ){
		return $result;
	}

	foreach( $arcresults as $arcresult ){

		$url = get_month_link( $arcresult->year, $arcresult->month );
		$text = sprintf( '%s %d', $month[ zeroise( $arcresult->month, 2 ) ], $arcresult->year );
		$result .= get_archives_link( $url, $text, '', $before, $after );

		$thismonth = zeroise( $arcresult->month, 2 );
		$thisyear = $arcresult->year;

		$arcresults2 = $wpdb->get_results( "
			SELECT ID, post_date, post_title, comment_status, guid, comment_count FROM $wpdb->posts
			WHERE post_date LIKE '$thisyear-$thismonth-%' AND post_status='publish' AND post_type='$post_type' AND post_password=''
			ORDER BY post_date DESC $LIMIT
		" );

		if( $arcresults2 ){

			$result .= "<ul class=\"postspermonth\">\n";

			foreach( $arcresults2 as $arcresult2 ){

				if( $arcresult2->post_date != '0000-00-00 00:00:00' ){

					$url = get_permalink( $arcresult2->ID ); //$arcresult2->guid;
					$arc_title = $arcresult2->post_title;

					if( $arc_title ){
						$text = strip_tags( $arc_title );
					}
					else{
						$text = $arcresult2->ID;
					}

					$result .= "<li>" . get_archives_link( $url, $text, '' );

					if( $show_comment_count ){
						$cc = $arcresult2->comment_count;
						if( $arcresult2->comment_status == "open" or $comments_count > 0 ){
							$result .= " ($cc)";
						}
					}

					$result .= "</li>\n";
				}
			}

			$result .= "</ul>\n";
		}

	}

	return $result;
}

Код этот нужно вставлять в файл темы function.php или непосредственно в файл, где эта функция используется (с ней я обычно так и поступаю), а там где мы хотим вывести список, вставляем такой код:

<?php echo get_blix_archive(1, '<h4>', '</h4>'); ?>

Чтобы настроить внешний вид списков, используйте CSS селекторы .postspermonth{...} и .postspermonth li{...}

Расширенное использование

В процессе эволюции функция претерпела ряд изменений и теперь, моими стараниями, умеет:

Ограничивать вывод годом

<?php echo get_blix_archive(1, '<h4>', '</h4>', 2009); ?>

Будут выведены посты только за 2009 год.

Понимать какой тип записей выводить

Можно выводить посты по месяцу, с указанием какой тип постов мы хотим вывести. Нужно это, если на сайте зарегистрирован новый тип записей, отличный от post. Допустим новый тип записей называется post_type, тогда код будет такой:

<?php echo get_blix_archive( 1, '<h4>', '</h4>', 0, 'post_type' ); ?>

Лимитировать вывод

И последний параметр передаваемый функции - это ограничитель (лимит) количества постов выводимых для каждого месяца. Его я добавил потому что при проверке этой функции на сайте с 20 тысячами постов безлимитный вывод сильно грузил процессор. По умолчанию для каждого месяца будет выводиться максимум 100 записей.

14 комментариев
Полезные 1 Все
    Войти