Настроить пагинацию так что бы начиная со второй страницы использовался другой шаблон WordPress

У меня есть стартовая страница блога, на которой выводится несколько блоков со статьями.

  • Первый блок - это вывод последней опубликованной статьи
  • Второй блок - это вывод статей со 2й по 7ю статью
  • Третий блок - это вывод статей, начиная с 8й статьи и к нему подключена пагинация

Если я нажимаю "перейти на следующую страницу", то на ней отображается все что было на стартовой странице, а мне нужно, чтобы начиная со второй страницы, просто выводилась лента постов (12 постов), начиная с 14 поста, и на каждой последующей странице просто продолжало выводить все посты по очереди.

Подскажите, есть ли вариант решения такой задачи и как это лучше всего реализовать?

Код вывода постов:

<?php
                $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
                $args = array(
                    'paged' => $paged,
                    'offset' => 7,
                    'posts_per_page' => 6,
                );
                query_posts($args);
            ?>

Код выводы пагинации:

<?php endwhile ; ?>        
            <div class="list-item">
            <!--paginate-->
                    <?php the_posts_pagination (
                    $args = array(
                        'show_all'     => false, 
                        'end_size'     => 0,     
                        'mid_size'     => 1, 
                        'prev_next'    => true, 
                        'prev_text'    => __('Previous'),
                        'next_text'    => __('Next'),
                        'add_args'     => false, 
                        'add_fragment' => '',  
                        'screen_reader_text' => __( 'Posts navigation' ),
                        'type' => 'list',
                    )
                    );
                    ?>   
            </div>
            <?php else : ?>
            <?php endif ; ?> 

 

Ответы (2 шт):

Автор решения: KAGG Design

Вот эта функция выведет то, что вам нужно. Код протестирован, работает.

/**
 * Show content.
 */
function my_content() {
    $posts_per_page = 5;

    $paged = 1;
    $uri   = filter_var( wp_unslash( $_SERVER['REQUEST_URI'] ), FILTER_SANITIZE_STRING );

    if ( preg_match( '#^.+/page/(\d+)#', $uri, $matches ) ) {
        $paged = (int) $matches[1];
    }

    echo '===== post 1 =====';

    $args = [
        'post_type'      => 'post',
        'post_status'    => 'publish',
        'posts_per_page' => 1,
    ];

    $query = new WP_Query( $args );

    if ( $query->have_posts() ) {
        while ( $query->have_posts() ) {
            $query->the_post();
            echo wp_kses_post( '<p>' . get_the_title() . '</p>' );
        }
    }

    wp_reset_postdata();

    echo '===== posts 2-6 =====';

    $args = [
        'post_type'      => 'post',
        'post_status'    => 'publish',
        'posts_per_page' => $posts_per_page,
        'offset'         => 1,
    ];

    $query = new WP_Query( $args );

    if ( $query->have_posts() ) {
        while ( $query->have_posts() ) {
            $query->the_post();
            echo wp_kses_post( '<p>' . get_the_title() . '</p>' );
        }
    }

    wp_reset_postdata();

    echo '===== posts 7- with pagination =====';

    $initial_offset = 6;
    $offset         = $initial_offset + ( $paged - 1 ) * $posts_per_page;

    $args = [
        'post_type'      => 'post',
        'post_status'    => 'publish',
        'posts_per_page' => $posts_per_page,
        'offset'         => $offset,
        'paged'          => $paged,
    ];

    $query = new WP_Query( $args );

    $paginate_args = [
        'total'   => (int) ( ( $query->found_posts - $initial_offset ) / $posts_per_page ),
        'current' => $paged,
    ];

    if ( $query->have_posts() ) {
        while ( $query->have_posts() ) {
            $query->the_post();
            echo wp_kses_post( '<p>' . get_the_title() . '</p>' );
        }

        echo wp_kses_post( paginate_links( $paginate_args ) );
    }

    wp_reset_postdata();

}

Проблемы в данной задаче следующие.

  1. Нельзя использовать query_posts(), это функция для ядра, она работает с глобальными переменными. Для нескольких запросов на странице надо использовать только WP_Query.

  2. После цикла с WP_Query надо вызывать reset_postdata(), чтобы вернуть глобальные переменные в исходное состояние.

  3. Пагинацию надо делать через paginate_links, потому что the_post_pagination работает только для главного цикла WordPress.

  4. Смещения и количество страниц пагинации надо корректировать кодом.

→ Ссылка
Автор решения: Slava Nikitina

Вот прилагаю свой ответ. В данном случае я создала 4-ре цикла которые выводят в разных блоках страницы нужное количество постов. Так же был создан пятый цикл которые начинает работать с того момента как мы переключились на вторую страницу постов и далее.

Для пагинации я использовала the_posts_pagination так требовалось по моему тз и для того что бы она корректно работала я использовала глобальную переменную WP_Query

 <?php
                      if(!get_query_var('page')) { 
                    ?>
                <div class="wrap-blog-home-page">                                       
                      <?php                 
                       $args = array(
                        'posts_per_page' => 1,
                        'paged' => (get_query_var('page')) ? get_query_var('page') : 1  
                                            );
                       $queryLasPost = new WP_Query( $args );
                      ?>
                      
                      <?php
                        if ( $queryLastPost->have_posts()): 
                        while ( $queryLastPost->have_posts() ) : $queryLastPost->the_post();
                      ?>
                      <!--posts--->
                                      
                    <?php endwhile ; ?>
                    <?php wp_reset_postdata(); ?>
                    <?php else : ?>
                    <?php endif ; ?>

                <section class="bodyContent">           
                       <?php
                       $args = array(
                        'offset' => 1,
                        'posts_per_page' => 6,
                                            );
                       $queryFirstBlock = new WP_Query( $args );                            
                       ?>
                      <?php
                        if ( $queryFirstBlock->have_posts()): 
                        while ( $queryFirstBlock->have_posts() ) : $queryFirstBlock->the_post();
                      ?>
                        <!--posts--->

                    <?php endwhile ; ?> 
                    <?php wp_reset_postdata(); ?>
                    <?php else : ?>
                    <?php endif ; ?>

                    <section class="bodyContent">   
                    <?php
                        $args = array(
                            'offset' => 8,
                            'posts_per_page' => 6, 
                            'paged' => (get_query_var('page')) ? get_query_var('page') : 1 
                                                        );
                        $querySecondBlock = new WP_Query( $args );
                    ?>
                    <?php
                        if ( $querySecondBlock->have_posts()): 
                        while ( $querySecondBlock->have_posts() ) : $querySecondBlock->the_post();
                        
                    ?>
                            <!--posts--->           
                    <?php endwhile ; ?>   
                    <?php wp_reset_postdata(); ?>
                    
                    <?php else : ?>
                    <?php endif ; ?>
                </section>

                <section class="bodyContent">   
                <?php
                    $args = array(
                    'posts_per_page' => 12, 
                    'paged' => (get_query_var('page')) ? get_query_var('page') : 1 
                                                    );
                    $queryThirdBlock = new WP_Query( $args );
                ?>
                <?php
                    if ( $queryThirdBlock->have_posts()): 
                    while ( $queryThirdBlock->have_posts() ) : $queryThirdBlock->the_post();
                ?>
                    <!--posts--->  
                    <?php endwhile ; ?>   
                    <?php wp_reset_postdata(); ?>
                    <?php else : ?>
                    <?php endif ; ?>
                </section>

        <?php
             } else { 
        ?>

        <section class="bodyContent">   
        <?php
            $args = array(
            'posts_per_page' => 12, 
            'paged' => (get_query_var('page')) ? get_query_var('page') : 1 
                                            );
            $queryThirdBlock = new WP_Query( $args );
         ?>
        <?php
            if ( $queryThirdBlock->have_posts()): 
            while ( $queryThirdBlock->have_posts() ) : $queryThirdBlock->the_post();
        ?>  
            <!--posts--->
            <?php endwhile ; ?>   
            <?php wp_reset_postdata(); ?>
            
            <!-- nextpage -->
            
            <?php else : ?>
            <?php endif ; ?>
        </section>
        <?php 
              }
        ?>
       <section class="bodyContent">
        <?php
            global $wp_query;
            $restore_wp_query = $wp_query;
            $wp_query = $queryThirdBlock;
        ?>
        <div class="list-item">
            <!--paginate-->
            <?php the_posts_pagination (
                 $args = array(
                 'show_all'     => false, 
                 'end_size'     => 0,     
                 'mid_size'     => 1, 
                 'prev_next'    => true, 
                 'prev_text'    => __('Previous'),
                 'next_text'    => __('Next'),
                 'add_args'     => false, 
                 'add_fragment' => '',  
                 'screen_reader_text' => __( 'Posts navigation' ),
                 'type' => 'list',
                    )
                    );
              ?>  
            <?php 
                $wp_query = $restore_wp_query;
            ?>
            </div>
      </section>
    </div>
<?php get_footer(); ?>
→ Ссылка