Пагинация при использовании wp_query?

27 янв. 2017 г., 08:18:08
Просмотры: 203K
Голосов: 47
<!-- запрос -->
<?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, но безуспешно. В этом скрипте есть комментарий "ЧТО ДОЛЖНО БЫТЬ ЗДЕСЬ?"... так что же должно быть там?

Это происходит на статической странице, которая не является главной страницей или страницей записей.

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

Замените <!-- 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'    => __( '&laquo; Назад', 'text-domain' ),
        //'next_text'    => __( 'Вперед &raquo;', 'text-domain' ),
        //'prev_text'    => __( '&lsaquo; Назад', 'text-domain' ),
        //'next_text'    => __( 'Вперед &rsaquo;', '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;
}
27 янв. 2017 г. 08:34:18
Комментарии

Думаю, я опоздал. Но вопрос в том... зачем мне писать 999999999?

MFarooqi MFarooqi
21 мар. 2021 г. 01:47:21

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

Dave Romsey Dave Romsey
26 мар. 2021 г. 17:32:30

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

mark-in-motion mark-in-motion
13 июл. 2022 г. 10:26:23

@mark-in-motion Конечно! Добавил пример к ответу.

Dave Romsey Dave Romsey
15 июл. 2022 г. 21:53:08
2
15

Этот код предназначен для создания пользовательской пагинации запросов. Вы можете следовать шагам, чтобы создать свою собственную пагинацию в 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/

15 нояб. 2017 г. 10:31:04
Комментарии

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

Karue Benson Karue Karue Benson Karue
27 июн. 2021 г. 03:41:08

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

User User
21 февр. 2023 г. 05:54:43
0

Если кто-то попал сюда, пытаясь создать 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() после возврата буферизированного контента
    }
}
27 мая 2021 г. 08:38:48
1

Вы можете просто использовать встроенную функцию WordPress

<?
the_posts_pagination()
?>

Она отлично справляется с задачей, включая работу с пользовательскими WP_Query

27 нояб. 2020 г. 00:47:37
Комментарии

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

Adrian B Adrian B
18 окт. 2023 г. 15:31:36