Пагинация пользовательского запроса
Я пытаюсь создать пользовательский шаблон страницы, который показывает самые просматриваемые посты. Я могу вернуть посты, но у меня возникли проблемы с настройкой пагинации. Вот что у меня есть:
$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;
Буду благодарен за любую помощь.
Это проблема локальной/глобальной переменной. Её можно решить либо изменением функции пагинации для работы с локальной переменной, либо переводом локальной переменной в глобальную область видимости. Поскольку вы используете 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();

Попробуйте так...
$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();
.

Я также столкнулся с этой проблемой и решил её следующим образом
Функция пагинации
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();
