Функция отображения постов по месяцам: руководство и примеры использования

# Функция для отображения всех постов по месяцам публикации

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

## Зачем это нужно?

Эта функция позволяет отображать посты, сгруппировав их по месяцам публикации. Выглядит это так:

![Пример отображения постов по месяцам](assets/uploads/2010/12/blix_archive.gif)

## Как это работает?

Вот код самой функции:

/**
 * Функция для отображения постов по месяцам.
 *
 * @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') Тип поста. Используйте, если необходимо отобразить пользовательский тип поста (отличный от поста).
 * @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 $cc > 0 ){
                            $result .= " ($cc)";
                        }
                    }

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

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

    }

    return $result;
}
[sourcecode]

Этот код нужно вставить в файл <code>functions.php</code> вашей темы или прямо туда, где хотите отобразить список постов, добавив следующий код:

[sourcecode language="php"]<?php echo get_blix_archive(1, '<h4>', '</h4>'); ?>

Для настройки стилей списка используйте CSS-селекторы .postspermonth{...} и .postspermonth li{...}.

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

Функция может быть модифицирована для расширенного использования:

### Ограничение по году

Если хотите вывести посты только за определённый год, используйте:

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

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

### Указание типа поста

Вы можете указать, какой тип постов нужно отображать. Например, если у вас есть новый тип поста под названием post_type, используйте:

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

### Ограничение вывода

Последний параметр функции — это лимит (limit) на количество отображаемых постов за каждый месяц. Стандартное значение — максимум 100 постов. Это уменьшает нагрузку на сервер, особенно если на сайте много постов.

Теперь вы знает��, как использовать эту полезную функцию для отображения постов по месяцам!

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *