Не удается настроить paginate_links с пользовательским запросом
Я создал раздел новостей на своем сайте WordPress с помощью плагинов Advanced Custom Fields и Custom Post Type UI. На странице обзора новостей (не стандартные записи WordPress) я хотел ограничить количество новостей до шести на странице и добавить навигацию с помощью paginate_links. Я создал следующий код:
<section class="news-main" role="main">
<?php
$args = array(
'post_type' => 'news',
'posts_per_page' => '6'
);
$the_query = new WP_Query( $args );
$temp_query = $wp_query;
$wp_query = NULL;
$wp_query = $the_query;
$pagination = array(
'base' => '%_%',
'format' => '?page=%#%',
'total' => $the_query->max_num_pages,
'prev_next' => True,
'prev_text' => __( '<< Предыдущая' ),
'next_text' => __( 'Следующая >>' )
);
if ( $the_query->have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
<article class="news-snippet">
<header class="news-box">
<h2 class="mus-hi slogan-head fancy"><span class="fancy-hook"><?php the_time( 'j. F Y' ); ?></span></h2>
<a href="<?php the_permalink(); ?>"><p class="bran-hn slogan-state closure"><?php the_title(); ?></p></a>
</header>
<div class="news-wrap">
<p class="news-excerpt"><?php echo acf_excerpt( 'news_post', 35, ' <span class="news-more-inbox">[...]</span>' ); ?></p>
<p class="bran-hn news-more"><a href="<?php the_permalink(); ?>">Подробнее →</a></p>
</div>
</article>
<?php endwhile; ?>
<?php wp_reset_postdata(); ?>
<?php else: ?>
<p>Записей нет</p>
<?php endif; ?>
<nav>
<?php echo paginate_links( $pagination );
$wp_query = NULL;
$wp_query = $temp_query; ?>
</nav>
</section>
Сначала определяются аргументы для wp_query, затем устанавливается $the_query
с WP_Query, после этого переменная $wp_query
сохраняется во временную переменную, сбрасывается в NULL и затем устанавливается в переменную $the_query
. На последнем этапе устанавливается массив настроек для paginate_links
. Далее идет цикл для вывода новостей. После цикла вызывается функция paginate_links и, наконец, $wp_query
сбрасывается и записывается обратно содержимое временной переменной $temp_query
.
Если у меня есть, скажем, 15 записей блога, мой вывод выглядит следующим образом:
Если я наведу курсор на цифру три, конец URL выглядит следующим образом:
Проблема в том, что ссылки "предыдущая" и "следующая" не отображаются, хотя они установлены. Основная проблема в получаемом URL - если я нажму на цифру три, я попаду на страницу 404. "page 3" неизвестен для WordPress.
Обновление:
$args = array(
'post_type' => 'news',
'posts_per_page' => '1'
);
$the_query = new WP_Query( $args );
$temp_query = $wp_query;
$wp_query = NULL;
$wp_query = $the_query;
$total_pages = $wp_query->max_num_pages;
if ( $total_pages > 1) {
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$current_page = new WP_Query('post_type=news&posts_per_page=1&paged=' . $paged);
$pagination = array(
'base' => '%_%',
'format' => '?paged=%#%',
'mid-size' => 1,
'current' => $current_page,
'total' => $total_pages,
'prev_next' => True,
'prev_text' => __( '<< Предыдущая' ),
'next_text' => __( 'Следующая >>' )
);
}
Обновление 2:
Хорошо, со следующими изменениями в первой части кода навигация заработала
$args = array(
'post_type' => 'news',
'posts_per_page' => '3',
'paged' => get_query_var( 'paged' )
);
$the_query = new WP_Query( $args );
$temp_query = $wp_query;
$wp_query = NULL;
$wp_query = $the_query;
$total_pages = $wp_query->max_num_pages;
if ( $total_pages > 1) {
$the_paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$pagination = array(
'base' => @add_query_arg('paged','%#%'),
'format' => '?paged=%#%',
'mid-size' => 1,
'current' => $the_paged,
'total' => $total_pages,
'prev_next' => True,
'prev_text' => __( '<< Предыдущая' ),
'next_text' => __( 'Следующая >>' )
);
}
Остался только один вопрос (единственное, что все еще работает неправильно): возможно ли, чтобы первая ссылка была link вместо link/?paged=1

Что касается количества отображаемых страниц, ознакомьтесь с аргументами для paginate_links
, в частности end_size
и mid_size
.
Что касается ошибки 404 - проблема в том, что страницы 3 не существует. Возвращает ли страница контент или загружает шаблон 404, зависит от результатов основного запроса, а не вашего пользовательского запроса в шаблоне. Если это тип записи page
, попробуйте установить переменную запроса paged
вместо page
.

Спасибо, нумерация теперь работает нормально, потребовалось немного доработки в настройках, а также для ссылок "предыдущая" и "следующая". В целом пагинация выглядит хорошо, но пока не функционирует. Когда я нажимаю на цифру 2, перехожу на ?paged=2 и больше не получаю шаблон 404. Однако по-прежнему отображаются записи с первой страницы, а единица остается с классом current вместо того, чтобы переключиться на страницу 2. Также не отображается ссылка "Предыдущая".

Насчет твоего предположения, что всё опирается на основной запрос вместо моего кастомного - я думал, что с помощью $wp_query = $the_query;
я "перенес" свой кастомный запрос в основной и сделал его доступным для функции paginate_links.

Я добавил обновление в исходный пост с обновленным фрагментом кода для PHP-частей, связанных с paginate_links (пытался включить paged - но всё еще не работает :/ ).

возвращается 404 или нет, определяется до загрузки вашего шаблона, этот код никогда не выполняется, если переменные запроса не корректны. И вы видите первые 6 записей на каждой странице, потому что вы не установили paged
в аргументах вашего пользовательского запроса.

Ааааааааааа, я понял. Я немного тупил - использовать paged
уже в пользовательском запросе я не понял и не осознал, но теперь все встало на свои места. Глупый я :( Хорошо, отображение статей теперь работает идеально. Осталось только исправить, чтобы навигация paginate_links
отражала изменения. Но мне придется поиграться и попробовать завтра утром. Уже поздно. Спасибо!
