Добавление пагинации в пользовательский шаблон архива
Я пытаюсь добавить пагинацию в мой шаблон архива. Если я использую тот же код, что и в основном шаблоне блога, он не фильтрует результаты на основе тега в URL, а просто показывает все записи. Вероятно, это очевидно для большинства, но я явно что-то упускаю.
Мне удалось настроить страницу архива так, чтобы она показывала только соответствующие записи, используя следующий код (но без пагинации):
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<div class="col span_1_of_1 border_bottom">
<h3 class="subtitle no_margin_bottom"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3>
<p class="blog_meta_information date">
Автор: <a href="<?php echo get_author_posts_url( get_the_author_meta( 'ID' ), get_the_author_meta( 'user_nicename' ) ); ?>"><?php the_author(); ?></a>
|
Дата: <?php the_time('jS F Y') ?>
<?php if(has_tag()) { ?>
<br>
Теги: <?php the_tags( '',', ','' ); ?>
<?php } else {} ?>
</p>
<p><?php the_field('introduction'); ?></p>
<a href="<?php the_permalink(); ?>">Читать далее</a>
</div>
<?php endwhile; endif; wp_reset_postdata(); ?>
У меня также работает пагинация в основном блоге с использованием следующего кода:
<?php
$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
$custom_args = array(
'post_type' => 'post',
'posts_per_page' => 10,
'paged' => $paged
);
$custom_query = new WP_Query( $custom_args );
?>
<?php if( $custom_query->have_posts() ) : while( $custom_query->have_posts() ) : $custom_query->the_post(); ?>
<div class="col span_1_of_1 border_bottom">
<h3 class="subtitle no_margin_bottom"><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3>
<p class="blog_meta_information date">
Автор: <a href="<?php echo get_author_posts_url( get_the_author_meta( 'ID' ), get_the_author_meta( 'user_nicename' ) ); ?>"><?php the_author(); ?></a>
|
Дата: <?php the_time('jS F Y') ?>
<?php if(has_tag()) { ?>
<br>
Теги: <?php the_tags( '',', ','' ); ?>
<?php } else {} ?>
</p>
<p><?php the_field('introduction'); ?></p>
<a href="<?php the_permalink(); ?>">Читать далее</a>
</div>
<?php endwhile; endif; wp_reset_postdata(); ?>
<!-- ПАГИНАЦИЯ -->
<?php
if (function_exists(custom_pagination)) {
custom_pagination($custom_query->max_num_pages,"",$paged);
}
?>
Выше также используется следующий код из моего файла functions.php:
// ПАГИНАЦИЯ
function custom_pagination($numpages = '', $pagerange = '', $paged='') {
if (empty($pagerange)) {
$pagerange = 2;
}
/**
* Эта первая часть нашей функции является запасным вариантом
* для пользовательской пагинации внутри обычного цикла,
* который использует глобальные переменные $paged и $wp_query.
*
* Это хорошо, потому что теперь мы можем переопределить пагинацию по умолчанию
* в нашей теме и использовать эту функцию в стандартных
* и пользовательских запросах.
*/
global $paged;
if (empty($paged)) {
$paged = 1;
}
if ($numpages == '') {
global $wp_query;
$numpages = $wp_query->max_num_pages;
if(!$numpages) {
$numpages = 1;
}
}
/**
* Мы создаем аргументы пагинации для передачи в нашу функцию
* paginate_links.
*/
$pagination_args = array(
'base' => get_pagenum_link(1) . '%_%',
'format' => 'page/%#%',
'total' => $numpages,
'current' => $paged,
'show_all' => False,
'end_size' => 1,
'mid_size' => $pagerange,
'prev_next' => True,
'prev_text' => __('«'),
'next_text' => __('»'),
'type' => 'plain',
'add_args' => false,
'add_fragment' => ''
);
$paginate_links = paginate_links($pagination_args);
if ($paginate_links) {
echo "<div class='custom-pagination'>";
echo "<span class='page-numbers page-num'>Страница " . $paged . " из " . $numpages . "</span> ";
echo $paginate_links;
echo "</div>";
}
}
Кто-нибудь знает, как я могу сделать так, чтобы эта пагинация также работала с моим шаблоном архива?
Заранее спасибо,
Том
Начиная с версии 4.1.0, WordPress ввел функцию the_posts_pagination
для обработки ссылок нумерации страниц. Я использую её постоянно, и она просто работает. С любыми пользовательскими типами записей. Эту функцию следует использовать после цикла while
.
Смотрите: https://developer.wordpress.org/reference/functions/the_posts_pagination/

Спасибо за предложение, но на этом сайте мы всё ещё используем третью версию. Вы не подскажете, как можно добавить это по-старинке?

Отличная и удобная функция. Однако вы предлагаете использовать её после цикла while
, но когда я попробовал это, код повторялся над каждым результатом. Я разместил <?php the_posts_pagination( array( 'mid_size' => 2 ) ); ?>
непосредственно перед <?php if (have_posts()) : while(have_posts()) : the_post();?>
и это сработало корректно. (И как вы сказали, "это просто работает").

Краткое обновление по этому вопросу: я выбрал использование плагина WP-PageNavi (https://en-gb.wordpress.org/plugins/wp-pagenavi/) на странице архивов, а для основного блога оставил кастомную пагинацию, которая отлично справляется со своей задачей.
