Вопрос или проблема
У меня есть страница архива, которая подтягивает посты с помощью WP_Query()
. На главной странице сайта показываются 16 постов пользовательского типа, поэтому на странице архива я смещаю страницу архива на 16 постов.
Код для этого:
$newsArticles = new WP_Query(array(
'posts_per_page' => 16,
'offset' => 16,
'post_type'=> 'news'
));
while( $newsArticles->have_posts()){
$newsArticles->the_post(); ?>
// HTML
<?php } ?>
Однако на этой странице архива функция <?php echo paginate_links();?>
для отображения номеров страниц не работает. Когда я нажимаю на номера страниц или использую стрелки “вперед” и “назад”, показываются одни и те же посты на каждой странице.
Код для пагинации, который я использую:
<p>
<?php echo paginate_links(array(
'prev_text' => 'NEWER',
'next_text' => 'OLDER',
));?>
</p>
Кто-нибудь знает, как заставить пагинацию работать с параметром offset
в WP_Query()
, чтобы пагинация архива велась как обычная страница архива (с пагинацией)?
Документация WP_Query предупреждает о параметре offset: Установка параметра offset заменяет/игнорирует параметр paged и ломает пагинацию.
Попробуйте что-то вроде этого:
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$newsArticles = new WP_Query(array(
'posts_per_page' => 16,
'post_type'=> 'news',
'paged' => $paged,
));
while( $newsArticles->have_posts()){
$newsArticles->the_post(); ?>
// HTML
<?php } ?>
$big = 999999999; // нужно невероятное целое число
echo paginate_links( array(
'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
'format' => '?paged=%#%',
'current' => max( 1, get_query_var('paged') ),
'total' => $newsArticles->max_num_pages
) );
Смотрите больше примеров paginate_links здесь:
Я бы использовал что-то вроде этого:
$prev_link = get_previous_posts_link( '« ' . __( 'Previous Page' ) );
$next_link = get_next_posts_link( __( 'Next Page' ) . ' »' );
if ( $prev_link || $next_link ) {
$pagination = $prev_link ? sprintf( '<div class="pagination-previous alignleft">%s</div>', $prev_link ) : '';
$pagination .= $next_link ? sprintf( '<div class="pagination-next alignright">%s</div>', $next_link ) : '';
echo $pagination:
}
Или
Можно использовать the_posts_pagination()
.
Ответ или решение
Когда вы сталкиваетесь с проблемой пагинации, не работающей с параметром offset
в WP_Query()
, важно понимать, что этот параметр может конфликтовать с параметром paged
, создавая проблемы с отображением страниц. Документация WordPress предупреждает, что использование offset
приводит к игнорированию параметра paged
, что и является причиной неправильной работы пагинации в вашем случае. Однако есть альтернативные подходы, которые могут помочь обойти эту проблему.
Подробное руководство по решению проблемы с пагинацией
-
Понимание параметров
offset
иpaged
:
Параметрoffset
используется для пропуска определенного количества записей в выборке. Например, если вы хотите исключить первые 16 записей, вы добавляете'offset' => 16
в свой массив аргументов запроса. Однако это вызывает проблемы сpaged
, который отвечает за определение страницы, на которой находится пользователь. -
Использование параметра
paged
:
Вместо использованияoffset
, лучше всего использовать параметрpaged
, который рассчитан специально для работы с пагинацией. Настоящий рабочий пример кода будет выглядеть следующим образом:$paged = (get_query_var('paged')) ? get_query_var('paged') : 1; $offset = ($paged - 1) * 16 + 16; $newsArticles = new WP_Query(array( 'posts_per_page' => 16, 'post_type' => 'news', 'offset' => $offset )); while($newsArticles->have_posts()) { $newsArticles->the_post(); // Ваша HTML-разметка } echo paginate_links(array( 'base' => str_replace(999999999, '%#%', esc_url(get_pagenum_link(999999999))), 'format' => '?paged=%#%', 'current' => max(1, get_query_var('paged')), 'total' => $newsArticles->max_num_pages, 'prev_text' => 'NEWER', 'next_text' => 'OLDER', ));
-
Как работает этот подход:
- Мы используем
get_query_var('paged')
для определения текущей страницы. - Вычисляем
offset
на базе текущей страницыpaged
, добавляя 16, чтобы исключить первые посты. - Это позволяет вам управлять записью при каждой странице, корректируя визивом для отображения правильного набора постов.
- Мы используем
-
Оптимизация SEO и улучшение видимости:
- Убедитесь, что каждая страница имеет уникальные мета-теги и описание для улучшения индексации в поисковых системах.
- Добавьте семантические теги HTML5 и организуйте ссылки так, чтобы минимизировать внутренние циклы и повысить рейтинг страниц.
Использование данной методики обеспечит корректную работу архива с пагинацией без использования проблемных параметров, таких как offset
, тем самым улучшая пользовательский опыт и оптимизируя ваш сайт для поисковых систем.