Как стилизовать первые 3 записи иначе и использовать 2-й цикл для остальных записей / Проблемы с пагинацией и offset
Я работаю над темой и у меня возникли проблемы с циклами/пагинацией при использовании offset. Я поискал в интернете и попытался использовать только 1 цикл (согласно этой статье), но у меня не получается заставить это работать.
Я хочу, чтобы первые 3 записи вверху страницы были самыми свежими (записи 1-3), а затем следующие 3 записи (4-6) отображались внизу. При переходе по пагинации я хочу, чтобы вверху отображались записи (1-3), а внизу - (7-9).
Сейчас код работает так, что на первой странице все отображается правильно, но при нажатии "назад" в пагинации просто показываются те же 6 записей снова и снова на каждой предыдущей странице.
Вот мой код для страницы Index:
<?php get_header(); ?>
<div class="row post-carousel">
<?php
$args = array(
'posts_per_page' => '3',
);
$query = new WP_query ( $args );
if ( $query->have_posts() ) { ?>
<?php while ( $query->have_posts() ) : $query->the_post(); /* начало цикла */ ?>
<div class="col-xs-12 col-sm-4">
<article id="post-<?php the_ID(); ?>" <?php post_class( 'most-recent' ); ?>>
<?php if ( has_post_thumbnail() ) { ?>
<a href="<?php the_permalink(); ?>">
<div class="post-thumbnail-img"><?php the_post_thumbnail('index-carousel'); ?></div>
</a>
<?php } ?>
<?php the_title( sprintf( '<h2 class="entry-title"><a href="%s" rel="bookmark">', esc_url( get_permalink() ) ), '</a></h2>' ); ?>
</article><!-- #post-## -->
</div>
<?php // Конец цикла
endwhile;
rewind_posts();
} ?>
</div>
<div class="row newsletter-container">
<div class="newsletter col-sm-12 col-md-6">
<p>Подпишитесь на мою рассылку, чтобы получать все последние обновления!</p>
</div>
<div class="newsletter col-sm-12 col-md-6">
<!-- Begin MailChimp Signup Form -->
<!-- код здесь -->
<!--End mc_embed_signup-->
</div>
</div>
<?php query_posts('posts_per_page=3&offset=3');
if ( have_posts() ) : ?>
<?php /* Начало цикла */ ?>
<?php while ( have_posts() ) : the_post(); ?>
<?php
/* Подключение шаблона для конкретного формата записи
* Если вы хотите переопределить это в дочерней теме, включите файл
* с названием content-___.php (где ___ - название формата записи), и он будет использован вместо стандартного.
*/
get_template_part( 'content', get_post_format() );
?>
<?php endwhile; ?>
<?php _tk_content_nav( 'nav-below' ); ?>
<?php else : ?>
<?php get_template_part( 'no-results', 'index' ); ?>
<?php endif; ?>
<?php get_footer(); ?>
Также, когда я пытаюсь использовать альтернативный синтаксис PHP для управляющих структур, код просто перестает работать, и вся страница становится белой.
Добавляю также код навигации:
if ( ! function_exists( '_tk_content_nav' ) ) :
/**
* Отображение навигации на следующую/предыдущую страницы, когда это уместно
*/
function _tk_content_nav( $nav_id ) {
global $wp_query, $post;
// Не выводить пустую разметку на одиночных страницах, если некуда переходить.
if ( is_single() ) {
$previous = ( is_attachment() ) ? get_post( $post->post_parent ) : get_adjacent_post( false, '', true );
$next = get_adjacent_post( false, '', false );
if ( ! $next && ! $previous )
return;
}
// Не выводить пустую разметку в архивах, если только одна страница.
if ( $wp_query->max_num_pages < 2 && ( is_home() || is_archive() || is_search() ) )
return;
$nav_class = ( is_single() ) ? 'post-navigation' : 'paging-navigation';
?>
<nav role="navigation" id="<?php echo esc_attr( $nav_id ); ?>" class="<?php echo $nav_class; ?>">
<h1 class="screen-reader-text"><?php _e( 'Навигация по записям', '_tk' ); ?></h1>
<ul class="pager">
<?php if ( is_single() ) : // ссылки навигации для одиночных записей ?>
<?php previous_post_link( '<li class="nav-previous previous">%link</li>', '<span class="meta-nav">' . _x( '←', 'Ссылка на предыдущую запись', '_tk' ) . '</span> %title' ); ?>
<?php next_post_link( '<li class="nav-next next">%link</li>', '%title <span class="meta-nav">' . _x( '→', 'Ссылка на следующую запись', '_tk' ) . '</span>' ); ?>
<?php elseif ( $wp_query->max_num_pages > 1 && ( is_home() || is_archive() || is_search() ) ) : // ссылки навигации для главной страницы, архивов и поиска ?>
<?php if ( get_next_posts_link() ) : ?>
<li class="nav-previous previous"><?php next_posts_link( __( '<span class="meta-nav">←</span> Старые записи', '_tk' ) ); ?></li>
<?php endif; ?>
<?php if ( get_previous_posts_link() ) : ?>
<li class="nav-next next"><?php previous_posts_link( __( 'Новые записи <span class="meta-nav">→</span>', '_tk' ) ); ?></li>
<?php endif; ?>
<?php endif; ?>
</ul>
</nav><!-- #<?php echo esc_html( $nav_id ); ?> -->
<?php
}
endif; // _tk_content_nav
Мой совет — никогда не использовать query_posts
. Вместо этого используйте пользовательский запрос или хук pre_get_posts
в обоих случаях и всегда убеждайтесь, что вызываете wp_reset_postdata
после вашего пользовательского запроса.
НО поскольку ваша навигационная функция ссылается на global $wp_query
, вам придется использовать query_posts
, передавая параметр paged
.
<?php get_header(); ?>
<div class="row post-carousel">
<?php
$args = array(
'posts_per_page' => '3', // Количество постов на странице
);
$query = new WP_query ( $args );
if ( $query->have_posts() ) { ?>
<?php while ( $query->have_posts() ) : $query->the_post(); /* Начало цикла */ ?>
<div class="col-xs-12 col-sm-4">
<article id="post-<?php the_ID(); ?>" <?php post_class( 'most-recent' ); ?>>
<?php if ( has_post_thumbnail() ) { ?>
<a href="<?php the_permalink(); ?>">
<div class="post-thumbnail-img"><?php the_post_thumbnail('index-carousel'); ?></div>
</a>
<?php } ?>
<?php the_title( sprintf( '<h2 class="entry-title"><a href="%s" rel="bookmark">', esc_url( get_permalink() ) ), '</a></h2>' ); ?>
</article><!-- #post-## -->
</div>
<?php // Конец цикла
endwhile;
wp_reset_postdata();
} ?>
</div>
<div class="row newsletter-container">
<div class="newsletter col-sm-12 col-md-6">
<p>Подпишитесь на мою рассылку, чтобы быть в курсе всех обновлений!</p>
</div>
<div class="newsletter col-sm-12 col-md-6">
<!-- Начало формы подписки MailChimp -->
<!-- код формы здесь -->
<!-- Конец формы подписки mc_embed_signup -->
</div>
</div>
<?php
$paged = ( get_query_var('page') ) ? get_query_var('page') : 1;
$second_args = array(
'posts_per_page' => 3, // Количество постов на странице
'offset' => 3, // Смещение
'paged' => $paged // Номер текущей страницы
);
query_posts($second_args);
if ( have_posts() ) : ?>
<?php /* Начало цикла */ ?>
<?php while ( have_posts() ) : the_post(); ?>
<?php
/* Подключение шаблона для конкретного формата поста.
* Если вы хотите переопределить это в дочерней теме, включите файл
* с названием content-___.php (где ___ — название формата поста), который будет использоваться вместо стандартного.
*/
get_template_part( 'content', get_post_format() );
?>
<?php endwhile; wp_reset_postdata(); ?>
<?php _tk_content_nav( 'nav-below' ); ?>
<?php else : ?>
<?php get_template_part( 'no-results', 'index' ); ?>
<?php endif; ?>
<?php get_footer(); ?>

Я попробовал это, но пагинация всё равно не работает. При переходе к предыдущим записям всё равно отображаются те же записи, что и на первой странице... есть идеи, как исправить проблему с пагинацией?

Только что проверил вашу функцию навигации и вижу, что она ссылается на global $wp_query
. Обновил свой ответ

Возможно уже поздно, но я думаю, этот код может вам помочь.
<?php
if( !is_paged() ){ // Проверка, является ли это первой страницей блога, если да, то True
$homepagePosts = new WP_Query(array( 'posts_per_page' => 3 )); // Пользовательское условие для отображения только свежих записей
while ($homepagePosts->have_posts()) {
$homepagePosts->the_post(); ?>
<div class="clearfix mt-4 mb-4 wrapper">
<div class="clearfix single-post">
<div class="fl single-post-img">
<div class="blogthumb">
<?php if (has_post_thumbnail( $post->ID ) ): ?>
<?php $image = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), 'singplepost' ); ?>
<a href="<?php the_permalink() ?>"><img src="<?php echo $image[0]; ?>" alt="<?php the_title(); ?>" title="<?php the_title(); ?>"></a>
<?php endif; ?>
</div>
</div>
<div class="fl single-post-content">
<h2><a href="<?php the_permalink() ?>" rel="bookmark"><?php the_title(); ?></a></h2>
<span class="d-block position-relative mb-2"><?php echo wp_trim_words(get_the_excerpt(), 18); ?></span>
<span class="small" style="color:#888"><?php echo get_the_time('F jS, Y'); ?></span>
</div>
</div>
</div>
<?php } wp_reset_postdata(); ?>
<?php } ?>
<!-- Один большой пост -->
<!-- Остальные посты -->
<div class="clearfix wrapper">
<div class="clearfix authorpostcontainer">
<?php
$current_page = get_query_var('paged');
$current_page = max( 1, $current_page );
$per_page = 9;
$offset_start = 1;
$offset = ( $current_page - 1 ) * $per_page + $offset_start;
$post_list = new WP_Query(array(
'posts_per_page' => $per_page,
'paged' => $current_page,
'offset' => $offset, // Начинать со второго самого свежего поста.
));
// Ручной подсчет количества страниц, так как мы использовали пользовательский OFFSET (не 0),
// поэтому мы не можем просто использовать $post_list->max_num_pages или $post_list->found_posts без дополнительных расчетов.
$total_rows = max( 0, $post_list->found_posts - $offset_start );
$total_pages = ceil( $total_rows / $per_page );
if ( $post_list->have_posts() ):
while ( $post_list->have_posts() ):
$post_list->the_post();
?>
<div class="one-third fl blogbox">
<div class="blogthumb">
<?php if (has_post_thumbnail( $post->ID ) ): ?>
<?php $image = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), 'newpost' ); ?>
<a href="<?php the_permalink() ?>"><img src="<?php echo $image[0]; ?>" alt="<?php the_title(); ?>" title="<?php the_title(); ?>"></a>
<?php endif; ?>
</div>
<div class="blogdetails">
<a href="<?php the_permalink() ?>" rel="bookmark" class="posttitle"><?php the_title(); ?></a>
<span class="postdate"><?php echo get_the_time('F jS, Y'); ?></span><!-- | <php $current_cat_id = the_category_ID(false); ?><a href='<php echo get_category_link($current_cat_id); ?>' class="catlink"><php echo get_cat_name($current_cat_id); ?></a-->
</div>
</div>
<?php
endwhile;
endif;
wp_reset_postdata();
?>
</div>
</div>
<div class="clearfix wrapper mt-4 mb-4 text-center">
<?php
echo paginate_links( array(
'total' => $total_pages,
'current' => $current_page,
) );
?>
</div>
<!-- Остальные посты -->
