Как стилизовать первые 3 записи иначе и использовать 2-й цикл для остальных записей / Проблемы с пагинацией и offset

23 янв. 2017 г., 15:14:14
Просмотры: 1.59K
Голосов: -1

Я работаю над темой и у меня возникли проблемы с циклами/пагинацией при использовании 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( '&larr;', 'Ссылка на предыдущую запись', '_tk' ) . '</span> %title' ); ?>
            <?php next_post_link( '<li class="nav-next next">%link</li>', '%title <span class="meta-nav">' . _x( '&rarr;', 'Ссылка на следующую запись', '_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">&larr;</span> Старые записи', '_tk' ) ); ?></li>
            <?php endif; ?>

            <?php if ( get_previous_posts_link() ) : ?>
            <li class="nav-next next"><?php previous_posts_link( __( 'Новые записи <span class="meta-nav">&rarr;</span>', '_tk' ) ); ?></li>
            <?php endif; ?>

        <?php endif; ?>

        </ul>
    </nav><!-- #<?php echo esc_html( $nav_id ); ?> -->
    <?php
}
endif; // _tk_content_nav
0
Все ответы на вопрос 2
3

Мой совет — никогда не использовать 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(); ?>
23 янв. 2017 г. 15:43:16
Комментарии

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

Holly Holly
23 янв. 2017 г. 17:13:10

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

Tunji Tunji
23 янв. 2017 г. 17:21:53

Хм, я обновил код с вашими изменениями, но он всё равно не работает. Я включил код пагинации выше в своём первоначальном вопросе. Нужно ли там что-то изменить?

Holly Holly
23 янв. 2017 г. 17:39:53
0

Возможно уже поздно, но я думаю, этот код может вам помочь.

<?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><!--&nbsp;&nbsp;|&nbsp;&nbsp;<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>
<!-- Остальные посты -->
22 июн. 2022 г. 11:01:25