Пагинация при использовании wp_query?
<!-- запрос -->
<?php
$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
$query = new WP_Query( array(
'category_name' => 'investor-news',
'posts_per_page' => 2,
'paged' => $paged
) );
?>
<?php if ( $query->have_posts() ) : ?>
<!-- начало цикла -->
<?php while ( $query->have_posts() ) : $query->the_post(); ?>
<h2><a href="<?php the_permalink(); ?>" title="Читать"><?php the_title(); ?></a></h2>
<?php the_excerpt(); ?>
<?php echo get_the_date(); ?>
<?php endwhile; ?>
<!-- конец цикла -->
<!-- ЧТО ДОЛЖНО БЫТЬ ЗДЕСЬ?????? -->
<?php wp_reset_postdata(); ?>
<?php else : ?>
<p><?php _e( 'Извините, записей по вашим критериям не найдено.' ); ?></p>
<?php endif; ?>
Я пробовал все возможные способы, чтобы добиться пагинации на этой статической странице, используя функцию wp_query, но безуспешно. В этом скрипте есть комментарий "ЧТО ДОЛЖНО БЫТЬ ЗДЕСЬ?"... так что же должно быть там?
Это происходит на статической странице, которая не является главной страницей или страницей записей.
Замените <!-- WHAT GOES HERE?????? -->
на код пагинации ниже:
<div class="pagination">
<?php
echo paginate_links( array(
'base' => str_replace( 999999999, '%#%', esc_url( get_pagenum_link( 999999999 ) ) ),
'total' => $query->max_num_pages,
'current' => max( 1, get_query_var( 'paged' ) ),
'format' => '?paged=%#%',
'show_all' => false,
'type' => 'plain',
'end_size' => 2,
'mid_size' => 1,
'prev_next' => true,
'prev_text' => sprintf( '<i></i> %1$s', __( 'Новые записи', 'text-domain' ) ),
'next_text' => sprintf( '%1$s <i></i>', __( 'Старые записи', 'text-domain' ) ),
'add_args' => false,
'add_fragment' => '',
) );
?>
</div>
WordPress включает удобную функцию под названием paginate_links()
, которая выполняет основную работу. В приведенном выше примере вместо глобального объекта $wp_query
используется пользовательский объект WP_Query $query
.
Редактирование:
В ответ на комментарий от @mark-in-motion, вот пример функции-обертки для paginate_links()
, которую я сделал некоторое время назад. Вы можете добавить это в файл functions.php
вашей темы, а затем вызвать echo my_pagination();
в вашем шаблоне, чтобы отобразить пагинацию.
/**
* Числовая пагинация через основную функцию WordPress paginate_links().
* @link http://codex.wordpress.org/Function_Reference/paginate_links
*
* @param array $args
*
* @return string HTML для числовой пагинации
*/
function my_pagination( $args = array() ) {
global $wp_query;
$output = '';
if ( $wp_query->max_num_pages <= 1 ) {
return;
}
$pagination_args = array(
'base' => str_replace( 999999999, '%#%', esc_url( get_pagenum_link( 999999999 ) ) ),
'total' => $wp_query->max_num_pages,
'current' => max( 1, get_query_var( 'paged' ) ),
'format' => '?paged=%#%',
'show_all' => false,
'type' => 'plain',
'end_size' => 2,
'mid_size' => 1,
'prev_next' => true,
//'prev_text' => __( '« Назад', 'text-domain' ),
//'next_text' => __( 'Вперед »', 'text-domain' ),
//'prev_text' => __( '‹ Назад', 'text-domain' ),
//'next_text' => __( 'Вперед ›', 'text-domain' ),
'prev_text' => sprintf( '<i></i> %1$s',
apply_filters( 'my_pagination_page_numbers_previous_text',
__( 'Новые записи', 'text-domain' ) )
),
'next_text' => sprintf( '%1$s <i></i>',
apply_filters( 'my_pagination_page_numbers_next_text',
__( 'Старые записи', 'text-domain' ) )
),
'add_args' => false,
'add_fragment' => '',
// Пользовательские аргументы, не входящие в ядро WP:
'show_page_position' => false, // Опционально позволяет отображать HTML "Страница X из XX".
);
$pagination_args = apply_filters( 'my_pagination_args', array_merge( $pagination_args, $args ), $pagination_args );
$output .= paginate_links( $pagination_args );
// Опционально, показывать Страница X из XX.
if ( true == $pagination_args['show_page_position'] && $wp_query->max_num_pages > 0 ) {
$output .= '<span class="page-of-pages">' .
sprintf( __( 'Страница %1s из %2s', 'text-domain' ), $pagination_args['current'], $wp_query->max_num_pages ) .
'</span>';
}
return $output;
}

Это трюк, чтобы получить результаты get_pagenum_link()
с %#%
вместо номера страницы (999999999).

Есть ли способ добавить это в functions.php, чтобы можно было просто вызывать pageinate_links()
, а не весь этот код?

Этот код предназначен для создания пользовательской пагинации запросов. Вы можете следовать шагам, чтобы создать свою собственную пагинацию в WordPress.
<?php
/**
* Шаблон страницы: Пользовательская страница
*/
get_header(); ?>
<?php
$paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
$args = array(
'posts_per_page' => 4, // Количество записей на странице
'paged' => $paged // Текущая страница
);
$custom_query = new WP_Query( $args ); // Создаем пользовательский запрос
?>
<!----начало-------->
<div class="wrap">
<div id="primary" class="content-area">
<main id="main" class="site-main" role="main">
<?php
while($custom_query->have_posts()) : // Цикл по записям
$custom_query->the_post();
?>
<div>
<ul>
<li>
<h3><a href="<?php the_permalink(); ?>" ><?php the_title(); ?></a></h3>
<div>
<ul>
<div><a href="<?php the_permalink(); ?>"><?php the_post_thumbnail('thumbnail'); ?></a></div>
</ul>
<ul>
<p><?php echo the_content(); ?></p>
</ul>
</div>
<div>
</li>
</ul>
</div> <!-- конец блока записей -->
<?php endwhile; ?>
<?php if (function_exists("pagination")) { // Проверяем наличие функции пагинации
pagination($custom_query->max_num_pages); // Выводим пагинацию
} ?>
</main><!-- #main -->
</div><!-- #primary -->
</div><!-- .wrap -->
<!----конец-------->
<?php get_footer();
Ссылка на источник: https://www.wpblog.com/use-wp_query-to-create-pagination/

Кажется, функция pagination не существует, пожалуйста, помогите

@KarueBensonKarue это потому, что автор этого ответа скопировал что-то с другого сайта, а вы скопировали с этого сайта
Если перейти к источнику https://wpblog.com/use-wp_query-to-create-pagination/, вы увидите, как там объясняют определение функции pagination()

Если кто-то попал сюда, пытаясь создать wp_query с пагинацией внутри шорткода:
add_shortcode('wp_query_pagination_inside_shortcode', 'my_shortcode_function_tag');
if (!function_exists('my_shortcode_function_tag')) {
function my_shortcode_function_tag($atts)
{
ob_start(); // Включаем буферизацию вывода
global $paged;
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$atts = shortcode_atts(
array(
'post_type' => 'post',
// любые нужные параметры
),
$atts
);
$args = array(
'posts_per_page' => 3,
'paged' => $paged,
'post_type' => $atts['post_type'],
'orderby' => 'date',
'order' => 'DESC',
);
$the_query = new WP_Query($args);
if ($the_query->have_posts()) {
while ($the_query->have_posts()) {
$the_query->the_post();
get_template_part('template-parts/loop');
} //конец цикла while
$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' => $the_query->max_num_pages //$q - это ваш кастомный запрос
)
);
} // Пагинация внутри endif
return ob_get_clean(); // Возвращаем содержимое буфера без вывода
wp_reset_query(); // Возвращаемся к main_query() после возврата буферизированного контента
}
}

Нет, если вы используете его на странице, например. Здесь есть хорошее объяснение и подробное описание того, как можно решить эту проблему, но «костыльным» способом, который не рекомендуется.
