Добавление пагинации в пользовательский шаблон архива

19 сент. 2018 г., 18:24:16
Просмотры: 20.6K
Голосов: 2

Я пытаюсь добавить пагинацию в мой шаблон архива. Если я использую тот же код, что и в основном шаблоне блога, он не фильтрует результаты на основе тега в 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>
            &nbsp;&nbsp;|&nbsp;&nbsp;
            Дата: <?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>
            &nbsp;&nbsp;|&nbsp;&nbsp;
            Дата: <?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'       => __('&laquo;'),
        'next_text'       => __('&raquo;'),
        '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>";
    }
}

Кто-нибудь знает, как я могу сделать так, чтобы эта пагинация также работала с моим шаблоном архива?

Заранее спасибо,

Том

0
Все ответы на вопрос 2
2

Начиная с версии 4.1.0, WordPress ввел функцию the_posts_pagination для обработки ссылок нумерации страниц. Я использую её постоянно, и она просто работает. С любыми пользовательскими типами записей. Эту функцию следует использовать после цикла while.

Смотрите: https://developer.wordpress.org/reference/functions/the_posts_pagination/

19 сент. 2018 г. 19:19:20
Комментарии

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

Tom Perkins Tom Perkins
20 сент. 2018 г. 11:10:30

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

user38365 user38365
18 авг. 2020 г. 20:08:48
1

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

20 сент. 2018 г. 17:11:13
Комментарии

Это должно быть частью вашего вопроса

Varsha Dhadge Varsha Dhadge
20 сент. 2018 г. 17:14:02