Как использовать the_posts_navigation с wp_query и get_posts?
WordPress имеет функцию the_posts_navigation
начиная с версии 4.1.0. Но я не знаю, как использовать её с wp_query
или get_posts
. Следующий код находится в файле шаблона страницы.
Метод wp_query:
<?php
if ( get_query_var('paged') ) {
$paged = get_query_var('paged');
} else if ( get_query_var('page') ) {
$paged = get_query_var('page');
} else {
$paged = 1;
}
$get_posts=new wp_query('post_type=case&posts_per_page=2&paged='.$paged);
while($get_posts->have_posts()):$get_posts->the_post();
the_title();
endwhile;
the_posts_pagination( array(
'prev_text' => __( 'Предыдущая страница', 'cm' ),
'next_text' => __( 'Следующая страница', 'cm' ),
'before_page_number' => '<span class="meta-nav screen-reader-text">' . __( 'Страница', 'cm' ) . ' </span>',
) );
?>
Метод get_posts:
<?
while(have_posts()):the_post();
if ( get_query_var('paged') ) {
$paged = get_query_var('paged');
} else if ( get_query_var('page') ) {
$paged = get_query_var('page');
} else {
$paged = 1;
}
$case_posts=get_posts('post_type=case&posts_per_page=2&paged='.$paged);
echo '<pre>';
print_r($case_posts);
echo '</pre>';
foreach($case_posts as $case_post){
echo $case_post->post_title;
}
endwhile;
// Навигация по предыдущей/следующей странице
the_posts_pagination( array(
'prev_text' => __( 'Предыдущая страница', 'cm' ),
'next_text' => __( 'Следующая страница', 'cm' ),
'before_page_number' => '<span class="meta-nav screen-reader-text">' . __( 'Страница', 'cm' ) . ' </span>',
) );
?>
Они не работают и не отображают пагинацию, но при ручном вводе http://127.0.0.1/gdboer/?page_id=74&page=2 в адресной строке это работает. Кто может помочь, большое спасибо!
the_posts_navigation()
— это просто функция-обертка для get_the_posts_navigation()
, которая, в свою очередь, является оберткой для paginate_links
. Первые две функции используют те же самые параметры, что и paginate_links
, и фактически передают их в последнюю функцию.
get_the_posts_navigation()
и the_posts_navigation()
— это хорошие новые функции, так как они устраняют необходимость в большом количестве пользовательского кода и более удобны для начинающих пользователей, которые хотят иметь нумерованные ссылки пагинации.
Единственный недостаток get_the_posts_navigation()
заключается в том, что разработчики обернули функцию paginate_links
в условное выражение, которое гласит: если главный запрос ($wp_query
) содержит менее 1 страницы (помните, что первая страница — это 0
, а вторая — 2
), не показывать ссылки. Это проблематично для пользовательских запросов на шаблонах страниц. Страницы всегда имеют только одну страницу, поэтому эти функции не работают с пользовательскими запросами.
Единственное реальное решение, если вам нужно использовать the_posts_navigation()
, — это воспользоваться ответом @ChipBennet в этой публикации. Мне не нравится идея обнуления главного запроса (довольно костыльное решение, на мой взгляд, это похоже на использование query_posts
), но я не вижу другого способа заставить get_the_posts_navigation()
работать с пользовательскими запросами.

Спасибо за ваш ответ. Теперь я знаю, что функция не работает с пользовательскими запросами. Кстати, вам не нравится аннулирование основного запроса. Но какой метод вы использовали?

Я не использую нативную функцию, я написал свою собственную функцию пагинации, которую применяю. Вы можете посмотреть её здесь

Если я использую постоянную ссылку вида http://127.0.0.1/gdboer/?post_type=case, она не работает. А ссылка http://127.0.0.1/gdboer/?page_id=74 работает корректно.

У меня есть пользовательский шаблон, и я потратил(а) часы, пытаясь отобразить компонент пагинации. Вот что сработало для меня.
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args = array(
'posts_per_page' => 3,
'orderby' => 'menu_order',
'order'=> 'ASC',
'paged'=>$paged,
'post_type' => 'projects'
);
$projects = new WP_Query($args);
<!-- рабочий пример пагинации с номерами -->
...<?php endwhile;?>
<?php
$GLOBALS['wp_query']->max_num_pages = $projects->max_num_pages;
the_posts_pagination( array(
'mid_size' => 1,
'prev_text' => __( 'Назад', 'green' ),
'next_text' => __( 'Вперед', 'green' ),
'screen_reader_text' => __( 'Навигация по записям' )
) ); ?>
ИЛИ
<!-- рабочий пример пагинации без номеров -->
...<?php endwhile;?>
<?php next_posts_link( 'следующая', $projects->max_num_pages ); ?>
<?php previous_posts_link('предыдущая') ?>

Определенно интересная идея, но единственное, что мне не очень нравится — это изменение основного объекта запроса. Это своего рода хак, который может преследовать вас кошмарами, потому что вы не сбрасываете основной запрос после завершения работы. Просто имейте это в виду. Вот почему глобализация — такая опасная штука, любой может изменить значения. Помните, многие плагины зависят от глобальных переменных, особенно $wp_query
и $post
.

Эта функция использует get_the_posts_pagination()
, которая использует GLOBAL wp_query
для настройки функции paginate_links()
, поэтому я считаю, что она не будет работать с get_posts
.
Попробуйте использовать функцию paginate_links()
напрямую или функцию posts_nav_link()
.
Примечание: Убедитесь, что вы используете wp_reset_query()

спасибо за ваш ответ. Я знаю, что paginate_links работает для меня. но я хочу использовать новую функцию the_posts_navigation. Я внимательно изучил исходный код get_the_posts_navigation и ознакомился с темой twentyfifteen.
