Пагинация пользовательского запроса

12 июл. 2014 г., 19:37:34
Просмотры: 25.3K
Голосов: 3

Я пытаюсь создать пользовательский шаблон страницы, который показывает самые просматриваемые посты. Я могу вернуть посты, но у меня возникли проблемы с настройкой пагинации. Вот что у меня есть:

$args = array('orderby' => 'meta_value_num', 'meta_key' => 'post_views_count', 'posts_per_page' => 36 );
            $loop = new WP_Query( $args );
            while ( $loop->have_posts() ) : $loop->the_post();

Я пробовал:

$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1; 
            $args = array('paged' => $paged, 'orderby' => 'meta_value_num', 'meta_key' => 'post_views_count', 'posts_per_page' => 36 );
            $loop = new WP_Query( $args );
            while ( $loop->have_posts() ) : $loop->the_post();

но моя пагинация все равно не отображается. Интересно, связано ли это с моей функцией пагинации или с тем, как я настраиваю запрос.

Я просто вызываю свою функцию пагинации после запроса, все выглядит так:

<?php
            $paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1; 
            $args = array('paged' => $paged, 'orderby' => 'meta_value_num', 'meta_key' => 'post_views_count', 'posts_per_page' => 36 );
            $loop = new WP_Query( $args );
            while ( $loop->have_posts() ) : $loop->the_post();?>
                <?php get_template_part( 'content', get_post_format() ); ?>
            <?php endwhile; ?>
        <?php wp_reset_postdata(); ?>

<?php pagination(); ?>

Это моя функция пагинации:

if ( ! function_exists( 'pagination' ) ) :
    function pagination() {
        global $wp_query;

        $big = 999999999; // нужно маловероятное целое число

        echo paginate_links( array(
            'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
            'format' => '?paged=%#%',
            'current' => max( 1, get_query_var('paged') ),
            'total' => $wp_query->max_num_pages,
            'mid_size' => 1,
            'prev_text'    => __('«'),
            'next_text'    => __('»'),
            'type'         => 'list'
        ) );
    }
endif;

Буду благодарен за любую помощь.

5
Комментарии

Похоже, вы выполняете локальный запрос, при этом пагинация использует глобальную переменную запроса. Замените эту строку - $loop = new WP_Query( $args ); на query_posts( $args ). Также замените - $loop->have_posts() ) : $loop->the_post() на have_posts() ) : the_post(). И вам не нужно использовать wp_reset_postdata().

Shazzad Shazzad
12 июл. 2014 г. 20:35:27

Я слышал, что не стоит использовать query_posts для вывода пользовательского цикла.

justinw justinw
12 июл. 2014 г. 20:39:29

Это лучшая практика. Использование глобальной пагинации (get_query_var('paged')) в пользовательском запросе тоже не является лучшей практикой. Однако я напишу ответ через несколько секунд.

Shazzad Shazzad
12 июл. 2014 г. 20:45:14

Я нашел пост на эту тему. Использование этого метода работает довольно хорошо.

justinw justinw
12 июл. 2014 г. 20:46:35

Я нашел решение: Пагинация постов в WordPress

Fefar Ravi Fefar Ravi
5 окт. 2021 г. 19:37:36
Все ответы на вопрос 3
1

Это проблема локальной/глобальной переменной. Её можно решить либо изменением функции пагинации для работы с локальной переменной, либо переводом локальной переменной в глобальную область видимости. Поскольку вы используете wp_reset_postdata(), предположу, что вы хотите сохранить оригинальный запрос.

Изменение функции пагинации для принятия аргументов -

if ( ! function_exists( 'pagination' ) ) :

    function pagination( $paged = '', $max_page = '' ) {
        $big = 999999999; // маловероятное число
        if( ! $paged ) {
            $paged = get_query_var('paged');
        }

        if( ! $max_page ) {
            global $wp_query;
            $max_page = isset( $wp_query->max_num_pages ) ? $wp_query->max_num_pages : 1;
        }

        echo paginate_links( array(
            'base'       => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
            'format'     => '?paged=%#%',
            'current'    => max( 1, $paged ),
            'total'      => $max_page,
            'mid_size'   => 1,
            'prev_text'  => __( '«' ),
            'next_text'  => __( '»' ),
            'type'       => 'list'
        ) );
    }
endif;

И шаблон цикла будет выглядеть так -

$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1; 
$args = array(
    'paged'          => $paged, 
    'orderby'        => 'meta_value_num', 
    'meta_key'       => 'post_views_count', 
    'posts_per_page' => 36 
);
$loop = new WP_Query( $args );

if ( $loop->have_posts() ) :
    while ( $loop->have_posts() ) : 
        $loop->the_post();
        get_template_part( 'content', get_post_format() );
    endwhile;

    pagination( $paged, $loop->max_num_pages); // Функция пагинации
endif;

wp_reset_postdata();
12 июл. 2014 г. 20:49:22
Комментарии

Огромное спасибо

Muhammad Mehran Khan Attari Muhammad Mehran Khan Attari
11 сент. 2020 г. 14:26:41
1

Попробуйте так...

$paged = ( get_query_var( 'paged' ) ) ? absint( get_query_var( 'paged' ) ) : 1;
$args = array(
    'orderby' => 'meta_value_num', // Сортировка по числовому значению метаполя
    'meta_key' => 'post_views_count', // Метаполе с количеством просмотров
    'posts_per_page' => 36, // Количество записей на странице
    'paged' => $paged // Текущая страница пагинации
    );

$loop = new WP_Query( $args );
if ( $loop->have_posts() ) :
    while ( $loop->have_posts() ) : $loop->the_post();

            get_template_part( 'content', get_post_format() ); // Подключение шаблона контента

    endwhile;

    pagination(); // Функция пагинации

endif;
wp_reset_postdata(); // Сброс данных запроса

Пагинацию следует добавлять перед вызовом wp_reset_postdata();.

12 июл. 2014 г. 19:58:07
Комментарии

К сожалению, пагинация не сработала.

justinw justinw
12 июл. 2014 г. 20:21:25
0

Я также столкнулся с этой проблемой и решил её следующим образом

Функция пагинации

function post_pagination($paged = '', $max_page = '') {
    if (!$paged) {
        $paged = (get_query_var('paged')) ? get_query_var('paged') : ((get_query_var('page')) ? get_query_var('page') : 1);
    }

    if (!$max_page) {
        global $wp_query;
        $max_page = isset($wp_query->max_num_pages) ? $wp_query->max_num_pages : 1;
    }

    $big  = 999999999; // маловероятное целое число

    $html = paginate_links(array(
        'base'       => str_replace($big, '%#%', esc_url(get_pagenum_link($big))),
        'format'     => '?paged=%#%',
        'current'    => max(1, $paged),
        'total'      => $max_page,
        'mid_size'   => 1,
        'prev_text'  => __('« Предыдущая'),
        'next_text'  => __('Следующая »'),
    ));

    $html = "<div class='navigation pagination'>" . $html . "</div>";

    echo $html;
}

Запрос в пользовательском шаблоне

$paged = (get_query_var('paged')) ? get_query_var('paged') : ((get_query_var('page')) ? get_query_var('page') : 1);

$args = array(
    'post_type' => 'post',
    'post_status' => 'publish',
    'posts_per_page' => get_option('posts_per_page'),
    'order' => 'DESC',
    'orderby' => 'date',
    'paged' => $paged
);

$loop = new WP_Query($args);
if ($loop->have_posts()) :
    while ($loop->have_posts()) :
        $loop->the_post();
        get_template_part('content', get_post_format());
    endwhile;

    post_pagination($paged, $loop->max_num_pages);
endif;

wp_reset_postdata();
3 мар. 2022 г. 22:18:27