Настроить пагинацию так что бы начиная со второй страницы использовался другой шаблон 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 шт):
Вот эта функция выведет то, что вам нужно. Код протестирован, работает.
/**
* 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();
}
Проблемы в данной задаче следующие.
Нельзя использовать
query_posts(), это функция для ядра, она работает с глобальными переменными. Для нескольких запросов на странице надо использовать толькоWP_Query.После цикла с
WP_Queryнадо вызыватьreset_postdata(), чтобы вернуть глобальные переменные в исходное состояние.Пагинацию надо делать через
paginate_links, потому чтоthe_post_paginationработает только для главного цикла WordPress.Смещения и количество страниц пагинации надо корректировать кодом.
Вот прилагаю свой ответ. В данном случае я создала 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(); ?>