Вопрос или проблема
Я хочу сгруппировать посты по месяцам. Вот так:
Январь 2014
Название поста
Название поста
Декабрь 2013
Название поста
Ноябрь 2013
Название поста
Название поста
Название поста
Название поста
Мне нужно иметь 10 месяцев на странице, каждый месяц может иметь любое количество постов.
Я использую пагинацию WordPress kriesi для добавления пагинации на сайт.
Попробуйте этот код
<?php
$catnam = '1';
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
// общее количество записей для отображения на каждой странице
$showp = 4;
wp_get_archives("type=monthly&showposts=$showp&paged=$paged");
while (have_posts() ) : the_post();?>
<h4><a href="https://wordpress.stackexchange.com/questions/131770/<?php echo get_permalink(); ?>"><?php the_title();?></a></h4>
<?php endwhile;?>
<?php
global $wp_rewrite;
$paginate_base = get_pagenum_link(1);
if (strpos($paginate_base, '?') || ! $wp_rewrite->using_permalinks()) {
$paginate_format="";
$paginate_base = add_query_arg('paged', '%#%');
} else {
$paginate_format = (substr($paginate_base, -1 ,1) == "https://wordpress.stackexchange.com/" ? '' : "https://wordpress.stackexchange.com/") .
user_trailingslashit('page/%#%/', 'paged');;
$paginate_base .= '%_%';
}
echo '<div id="pagination">';
echo paginate_links( array(
'base' => $paginate_base,
'format' => $paginate_format,
'total' => $wp_query->max_num_pages,
'mid_size' => 10,
'current' => ($paged ? $paged : 1),
'type' => '',
'prev_text' => __('<p class="readmore">« Назад</p>', 'default'),
'next_text' => __('<p class="readmore">Вперёд »</p>', 'default'),
));
echo "</div>";
?>
.
Ответ или решение
Чтобы сгруппировать посты по месяцам и добавить пагинацию в WordPress, важно понимать структуру вашего сайта и методы работы с WP_Query. В данной инструкции мы пройдём основную логику и приведём пример реализации.
Шаги для группировки постов по месяцам и добавления пагинации
-
Настройка базового запроса: Разделим посты на страницы, чтобы можно было отобразить 10 месяцев за раз. Для каждого месяца должны отображаться все посты.
-
Использование функции для извлечения месячных архивов: Вместо функции
wp_get_archives
, которая сразу выводит месяцы, вам потребуется собрать данные и обработать их самостоятельно. -
Добавление пагинации: С помошью встроенных функций для пагинации в WordPress можно легко управлять навигацией по страницам.
Пример реализации кода
Вставьте следующий код в нужный файл вашей темы (например, archive.php
или page.php
):
<?php
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args = array(
'post_type' => 'post',
'posts_per_page' => -1, // Выбор всех постов, позже мы будем ограничивать отображение.
'paged' => $paged
);
$query = new WP_Query($args);
$posts_by_month = array();
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
$post_date = get_the_date('F Y'); // Получаем месяц и год поста
if (!isset($posts_by_month[$post_date])) {
$posts_by_month[$post_date] = array(); // Инициализируем массив для месяца
}
$posts_by_month[$post_date][] = get_the_title(); // Добавляем название поста в массив
}
}
// Пагинация
$total_posts = wp_count_posts()->publish; // Общее количество постов
$posts_per_page = 10; // Количество месяцев на странице
$total_pages = ceil(count($posts_by_month) / $posts_per_page);
$current_page = max(1, get_query_var('paged'));
$offset = ($current_page - 1) * $posts_per_page;
$current_months = array_slice(array_keys($posts_by_month), $offset, $posts_per_page);
// Вывод постов по месяцам
foreach ($current_months as $month) {
echo '<strong>' . esc_html($month) . '</strong><br>';
foreach ($posts_by_month[$month] as $post_title) {
echo esc_html($post_title) . '<br>';
}
echo '<br>'; // Разделение между месяцами
}
// Настройка пагинации
$base = str_replace(999999999, '%#%', esc_url(get_pagenum_link(999999999)));
$format = '?paged=%#%';
echo '<div id="pagination">';
echo paginate_links(array(
'base' => $base,
'format' => $format,
'current' => $current_page,
'total' => $total_pages,
'prev_text' => __('« Предыдущая'),
'next_text' => __('Следующая »'),
));
echo '</div>';
wp_reset_postdata();
?>
Пояснения к коду
- Запрос постов: Мы извлекаем все посты в массив и получаем названия постов, сгруппировав их по месяцам.
- Система пагинации: Определяем общее количество страниц и выводим пагинацию в конце, используя функцию
paginate_links
. - Форматирование вывода: Для каждого месяца создаётся заголовок, после которого выводятся названия всех постов.
Заключение
С помощью приведённого кода вы сможете организовать месячные архивы постов с пагинацией на своем WordPress-сайте. Убедитесь, что вы адаптируете код под свои нужды и тщательно проверяете его на тестовом сайте перед применением. Это не только улучшит пользовательский опыт, но и может положительно сказаться на SEO вашего сайта, позволяя пользователям легче находить нужный контент.