Вопрос или проблема
Я пытаюсь добавить постраничную навигацию к своему запросу WordPress, используя pagination_links(), однако ссылки для моей первой страницы и предыдущей ссылки не возвращаются? Другие ссылки добавляют строку запроса paged к URL, что затем перенаправляет вас на /page/3/, например. Не уверен, нужно ли мне обновить запрос ниже, чтобы добавить эти URL вместо строки запроса?
Кто-нибудь может увидеть, что не так с нижеуказанным, и как я могу сделать ссылки постраничной навигации правильными?
Любые советы и помощь будут оценены.
Запрос и постраничная навигация:
$posts_per_page = get_option('posts_per_page');
$paged = ( get_query_var( 'paged' ) ) ? absint( get_query_var( 'paged' ) ) : 1;
$args = array(
'posts_per_page' => $posts_per_page,
'post_type' => 'post',
'paged' => $paged,
);
$articles = new WP_Query( $args );
$args = array(
'base' => '%_%',
'format' => '?paged=%#%',
'current' => max( 1, get_query_var('paged') ),
'total' => $wp_query->max_num_pages,
'show_all' => false,
'end_size' => 1,
'mid_size' => 1,
'prev_next' => true,
'prev_text' => '<span class="icon icon-arrow-left" aria-hidden="true"></span><span class="sr-only">Предыдущая</span>',
'next_text' => '<span class="icon icon-arrow-right" aria-hidden="true"></span><span class="sr-only">Следующая</span>',
'type' => 'plain',
'add_args' => false,
'add_fragment' => '',
'before_page_number' => '',
'after_page_number' => ''
);
echo paginate_links( $args );
Возвращенный HTML:
<div class="pagination">
<a class="prev page-numbers" href=""><span class="icon icon-arrow-left" aria-hidden="true"></span><span class="sr-only">Предыдущая</span></a>
<a class="page-numbers" href="">1</a>
<span aria-current="page" class="page-numbers current">2</span>
<a class="page-numbers" href="?paged=3">3</a>
<a class="next page-numbers" href="?paged=3"><span class="icon icon-arrow-right" aria-hidden="true"></span><span class="sr-only">Следующая</span></a>
</div>
Я обновил базу в моем $args, что решило проблему.
'base' => preg_replace('/\?.*/', "https://wordpress.stackexchange.com/", get_pagenum_link()) . '%_%',
Ответ или решение
Отсутствие ссылок на первую страницу и кнопку «Предыдущая» в вашем коде пагинации WordPress может быть вызвано неправильной конфигурацией аргументов, передаваемых в функцию paginate_links()
. Давайте подробно разберем вашу проблему и предложим решение.
Анализ проблемы
-
Отсутствие ссылок на первую страницу и кнопку «Предыдущая»: Вы упомянули, что на первой странице не отображаются ссылки, а кнопка "Предыдущая" содержит пустой
href
. Это говорит о том, что функция не получает правильный URL для первой страницы. -
Правильное определение переменной
$paged
: Вы корректно задаете переменную$paged
, используяget_query_var('paged')
, но необходимо удостовериться, что ваш запрос (WP_Query) также учитывает текущее состояние пагинации. -
Формат ссылки на пагинацию: Ваш текущий формат ссылок указывает на
?paged=%#%
, что не всегда правильно обрабатывается для первой страницы, поскольку ссылка должна формироваться с использованием базового URL, который учитывает текущий контекст.
Рекомендации по исправлению
Чтобы решить проблему с отсутствующими ссылками и корректным формированием URL, вам стоит обновить аргументы для функции paginate_links()
. Вот как это можно сделать:
- Обновление аргумента
base
: Вы уже указали, что исправили базу для пагинации, но давайте еще раз разберем правильный подход. Используйтеget_pagenum_link()
для создания более стабильного URL.
$args = array(
'base' => '%_%',
'format' => 'page/%#%/', // Измените это для более удобного формирования ссылок
'current' => max( 1, get_query_var('paged') ),
'total' => $articles->max_num_pages, // Убедитесь, что вы используете $articles, а не $wp_query
'show_all' => false,
'end_size' => 1,
'mid_size' => 1,
'prev_next' => true,
'prev_text' => '<span class="icon icon-arrow-left" aria-hidden="true"></span><span class="sr-only">Предыдущая</span>',
'next_text' => '<span class="icon icon-arrow-right" aria-hidden="true"></span><span class="sr-only">Следующая</span>',
'type' => 'plain',
'add_args' => false,
'add_fragment' => '',
'before_page_number' => '',
'after_page_number' => ''
);
- Использование
get_pagenum_link()
: Эта функция автоматически создаёт правильные ссылки, которые могут использоваться как для первой страницы, так и для остальных.
Итоговый код
Таким образом, ваш полный код может выглядеть так:
$posts_per_page = get_option('posts_per_page');
$paged = ( get_query_var( 'paged' ) ) ? absint( get_query_var( 'paged' ) ) : 1;
$args = array(
'posts_per_page' => $posts_per_page,
'post_type' => 'post',
'paged' => $paged,
);
$articles = new WP_Query( $args );
$args = array(
'base' => get_pagenum_link(1) . '%_%',
'format' => 'page/%#%/', // или '?paged=%#%', в зависимости от ваших нужд
'current' => max( 1, get_query_var('paged') ),
'total' => $articles->max_num_pages,
'show_all' => false,
'end_size' => 1,
'mid_size' => 1,
'prev_next' => true,
'prev_text' => '<span class="icon icon-arrow-left" aria-hidden="true"></span><span class="sr-only">Предыдущая</span>',
'next_text' => '<span class="icon icon-arrow-right" aria-hidden="true"></span><span class="sr-only">Следующая</span>',
'type' => 'plain',
'add_args' => false,
'add_fragment' => '',
'before_page_number' => '',
'after_page_number' => ''
);
echo paginate_links( $args );
Заключение
Если вы внесёте эти изменения, это должно исправить проблему с отсутствием ссылок на первую страницу и кнопку «Предыдущая». Всегда полезно проверять значения переменных и проследить за тем, что передается в функции пагинации. Это позволит обеспечить корректное отображение навигационных элементов на вашей странице. Надеюсь, это поможет! Если у вас остались вопросы, не стесняйтесь задавать их.