Вопрос или проблема
Я хотел бы создать архив, который перечисляет посты под заголовком месяца. Месяцы будут просто текстом, а заголовки постов, очевидно, будут ссылками на сами посты!
Итак:
Октябрь 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, который будет отображать посты под заголовком соответствующего месяца, является распространённой задачей для веб-разработчиков и владельцев сайтов. В данной статье мы разберём, как это можно реализовать с учетом пагинации и отображения записей за один год на каждой странице.
Основные требования
- Отображение месяца и года: Названия месяцев должны быть текстовыми заголовками, под ними будут перечислены посты.
- Ссылки на посты: Заголовки постов должны быть гиперссылками на сами посты.
- Пагинация: Предоставление одной страницы для каждого года с записями за все месяцы этого года.
Пример решения
Ниже представлено решение на основе 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);
?>
Краткий разбор кода
-
Определение текущего года: В этом коде мы определяем текущий год и загружаем записи, используя
WP_Query
. Мы также устанавливаем переменные для пагинации. -
Группировка постов по месяцам: Все посты группируются в массив
$posts_by_month
по месяцам. Для каждого поста мы сохраняем название и ссылку. -
Вывод результатов: После того как записи сгруппированы, происходит вывод названия месяца и списков постов. Если постов за месяц нет, этот месяц не будет показан.
-
Пагинация: Для создания пагинации используется функция
paginate_links()
, которая создаёт ссылки на страницы.
Заключение
Данный код позволяет удобно организовать отображение записей в архиве по месяцам с возможностью пагинации. Мы переработали запросы таким образом, чтобы избежать лишней нагрузки на сервер и предоставить читателю удобный формат архива. Настройка параметров запроса и структуры вывода может быть изменена в зависимости от ваших требований и дизайна сайта.
Этот подход не только упрощает навигацию по записям, но и улучшает SEO вашего сайта, так как добавляет структурированный и удобочитаемый контент.