Отображать ссылки на посты под месяцем в пагинированном архиве

Вопрос или проблема

Я хотел бы создать архив, который перечисляет посты под заголовком месяца. Месяцы будут просто текстом, а заголовки постов, очевидно, будут ссылками на сами посты!

Итак:

Октябрь 2013

  • Заголовок поста 1
  • Заголовок поста 2

Сентябрь 2013

  • Заголовок поста 1
  • Заголовок поста 2

Август 2013

  • Заголовок поста 1
  • Заголовок поста 2

. . . и, если возможно, показывать только один год на странице! Так что, эмм, я полагаю, это тоже пагинировано.

Это возможно? Наверное. Я видел несколько тем, которые касаются подобных запросов, но ничего подобного. Или, может быть, я просто плохо ищу.

Может кто-нибудь помочь мне? Спасибо!

Вот что я нашел, что я разобью на части:

for ($i = 1; $i <= 12; $i++) {
    $month = date("n", strtotime( date( 'Y-m-01' )." -$i months"));
    $year = date("Y", strtotime( date( 'Y-m-01' )." -$i months"));

Цикл for будет проходить через то количество месяцев, которое мы хотим извлечь, что в данном случае равно 12. Переменная $month будет содержать целое число без ведущих нулей, которое мы можем использовать для ссылки на текущий (внутри цикла текущий) месяц позже. Я использую strtotime, чтобы начать с 1-го числа текущего (реального времени) месяца и считать назад оттуда. То же самое произойдет с $year

$tmpQuery = new WP_Query(array('monthnum' => $month, 'post-type' => 'post'));

Мы можем затем использовать переменную $month, чтобы запросить все посты в этом месяце. Затем мы можем войти в наш обычный цикл.

<?php 
    for ($i = 1; $i <= 12; $i++) {
        $month = date("n", strtotime( date( 'Y-m-01' )." -$i months"));
        $year = date("Y", strtotime( date( 'Y-m-01' )." -$i months"));

        $tmpQuery = new WP_Query(array('monthnum' => $month, 'year' => $year, 'post-type' => 'post'));

        if($tmpQuery->have_posts()) :
        ?>
            <h2><?php echo date("F", mktime(0, 0, 0, $month, 10)); ?> - <?php echo $year; ?></h2>
            <ul>

            <?php while($tmpQuery->have_posts()) : $tmpQuery->the_post(); ?>
                <li><a href="https://wordpress.stackexchange.com/questions/119802/<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
            <?php endwhile; ?>
            </ul>
        <?php else : ?>
            <p>Нет постов в этом месяце</p> 
        <?php endif; 
        // wp_reset_query();
    }
?>

Ответ или решение

Создание архивов записей под заголовком месяца с пагинацией в WordPress

Создание архива записей в WordPress, который будет отображать посты под заголовком соответствующего месяца, является распространённой задачей для веб-разработчиков и владельцев сайтов. В данной статье мы разберём, как это можно реализовать с учетом пагинации и отображения записей за один год на каждой странице.

Основные требования

  1. Отображение месяца и года: Названия месяцев должны быть текстовыми заголовками, под ними будут перечислены посты.
  2. Ссылки на посты: Заголовки постов должны быть гиперссылками на сами посты.
  3. Пагинация: Предоставление одной страницы для каждого года с записями за все месяцы этого года.

Пример решения

Ниже представлено решение на основе PHP и WP_Query, встроенного в WordPress.

<?php 
$currentYear = date('Y');
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$posts_per_page = 10; // Количество постов на странице

// Определяем год для архива
$query_year = get_query_var('year', $currentYear);

// Запрашиваем записи за текущий год
$args = array(
    'year'           => $query_year,
    'posts_per_page' => $posts_per_page,
    'paged'          => $paged,
);

$archiveQuery = new WP_Query($args);

// Массив для хранения постов по месяцам
$posts_by_month = array();

if ($archiveQuery->have_posts()) {
    while ($archiveQuery->have_posts()) {
        $archiveQuery->the_post();
        $month = get_the_date('F Y');

        if (!isset($posts_by_month[$month])) {
            $posts_by_month[$month] = array();
        }

        $posts_by_month[$month][] = array(
            'title' => get_the_title(),
            'link'  => get_permalink(),
        );
    }
    wp_reset_postdata();
}

// Отображение постов по месяцам
foreach ($posts_by_month as $month => $posts) {
    echo '<h2>' . esc_html($month) . '</h2>';
    echo '<ul>';

    foreach ($posts as $post) {
        echo '<li><a href="' . esc_url($post['link']) . '">' . esc_html($post['title']) . '</a></li>';
    }

    echo '</ul>';
}

// Пагинация
$big = 999999999; // уникальное число для замены
$pagination_args = array(
    'base'    => str_replace($big, '%#%', esc_url(get_pagenum_link($big))),
    'format'  => '?paged=%#%',
    'current' => max(1, get_query_var('paged')),
    'total'   => $archiveQuery->max_num_pages,
);

echo paginate_links($pagination_args);
?>

Краткий разбор кода

  1. Определение текущего года: В этом коде мы определяем текущий год и загружаем записи, используя WP_Query. Мы также устанавливаем переменные для пагинации.

  2. Группировка постов по месяцам: Все посты группируются в массив $posts_by_month по месяцам. Для каждого поста мы сохраняем название и ссылку.

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

  4. Пагинация: Для создания пагинации используется функция paginate_links(), которая создаёт ссылки на страницы.

Заключение

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

Этот подход не только упрощает навигацию по записям, но и улучшает SEO вашего сайта, так как добавляет структурированный и удобочитаемый контент.

Оцените материал
Добавить комментарий

Капча загружается...