Проблема с циклом Wordpress: множественные циклы, index.php и is_paged приводят к дублированию сообщений на следующей странице - PullRequest
0 голосов
/ 30 апреля 2011

Привет всем. Я не уверен, является ли то, что я испытываю, результатом ошибки (из-за недавнего обновления до 3.1.2) или плохого кода. С тех пор, как я обновился до версии 3.1.2, у меня возникла проблема с двумя циклами на моей странице индекса.

Вот что у меня есть для моей индексной страницы

<?php
        if ( ! is_paged() && is_front_page() ) {
            echo '<h6 class="sec1 title">FEATURE</h6>';
            $sticky = get_option( 'sticky_posts' );
            if ( isset( $sticky[0] ) ) {
                $args = array(
                    'posts_per_page' => 3,
                    'post__in'  => $sticky,
                    'ignore_sticky_posts' => 1);
                // Query
                $featured_query = new WP_query( $args );
                while ($featured_query->have_posts() ) :
                $featured_query->the_post();
                    $featured[] = $post->ID;

                get_template_part( 'content', 'featured' );

                endwhile;
            } // endif sticky
        } // endif is_paged
        ?>

        <?php
            $sticky = get_option( 'sticky_posts' );
            echo '<h6 class="sec1 title">LATEST ARTICLES</h6>';
            $paged = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;
            $query_args = array(
                'posts_per_page' => 10,
                'paged' => $paged,
                'post__not_in' => $featured,
                'post__not_in' => $sticky
                );

            query_posts($query_args);
            if (have_posts() ) :
            while (have_posts() ) :
            the_post();

            get_template_part( 'content', get_post_format() );
        ?>

        <!--<?php trackback_rdf(); ?>-->

        <?php endwhile; else: ?>

        <div class="box">
            <p>
                <?php _e( 'Sorry, no posts matched your criteria.' ); ?>
            </p>
        </div>

        <?php endif; ?>

// Navigation comes over here

Скажем, например, первый цикл (липкие сообщения) - который НЕ разбит на страницы, дает 3 сообщения и второй цикл (все остальные сообщения) - который разбит на страницы, дает 10 сообщений . Проблема, с которой я сталкиваюсь, заключается в том, что при переходе на следующую страницу последние 3 сообщения из второго цикла на странице 1 повторяются вверху страницы 2.

Примечание: первый цикл только на странице 1 и не повторяется на второй странице, что я и хотел.

Так вот, что я пытался, я удалил условие (! Is_paged () && is_front_page) вместе со всем первым циклом, и проблема была решена.

Что я делаю не так?

Ответы [ 3 ]

1 голос
/ 02 мая 2011

Спасибо, Крис,

Я изменил ваше предложение (которое, похоже, не сработало)

$paged = get_query_var('page');

if ($paged < 2) :
 // Put whatever you want to only show up on the first page here
endif;

до

$paged = get_query_var('paged');

if ($paged < 1 ) {
   // code goes here
}

Похоже, что первая страница не считается "постраничной" .. "постраничная" относится только к страницам за пределами первой страницы.

это обновленный код для всех, кому интересно. Шляпная подсказка Крису. Еще раз спасибо.

$paged = get_query_var('paged');

if ($paged < 1 ) {
    echo '<h6 class="sec1 title">FEATURE</h6>';
    $sticky = get_option( 'sticky_posts' );
    if ( isset( $sticky[0] ) ) {
        $args = array(
            'posts_per_page' => 3,
            'post__in'  => $sticky,
            'ignore_sticky_posts' => 1);
        // Query
        $featured_query = new WP_query( $args );
        while ($featured_query->have_posts() ) :
        $featured_query->the_post();

        get_template_part( 'content', 'featured' );

        endwhile;

        wp_reset_postdata();
    } // endif sticky
} // endif $paged
?>

<?php
    $sticky = get_option( 'sticky_posts' );
    echo '<h6 class="sec1 title">LATEST ARTICLES</h6>';
    $paged = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;
    $query_args = array(
        'posts_per_page' => 10,
        'paged' => $paged,
        'post__not_in' => $sticky
        );

    query_posts($query_args);
    if (have_posts() ) :
    while (have_posts() ) :
    the_post();

    get_template_part( 'content', get_post_format() );
?>

<!--<?php trackback_rdf(); ?>-->

<?php endwhile; else: ?>

<div class="box">
    <p>
        <?php _e( 'Sorry, no posts matched your criteria.' ); ?>
    </p>
</div>

<?php endif; ?>

альтернативой предыдущему примеру был тот, который я построил с нуля, прежде чем Крис ответил:

        <?php if ( isset( $sticky[0] ) && ! is_paged() ) {
                echo '<h6 class="sec1 title">FEATURE</h6>'; 
        } ?>

        <?php while ( have_posts() ) : the_post(); ?>

            <?php if ( is_sticky() ) {
                get_template_part( 'content', 'featured' );             
            } ?>

        <?php endwhile; ?>

        <?php rewind_posts(); ?> 

        <?php
        echo '<h6 class="sec1 title">LATEST ARTICLES</h6>';

        global $sticky;
        $paged = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;
        $args = array(
                'posts_per_page' => 10,
                'paged' => $paged,
                'post__not_in' => $sticky
            );
            query_posts( $args );
            while ( have_posts() ) :
            the_post() ;
        ?>

        <?php get_template_part( 'content', get_post_format() ); ?>

        <!--<?php trackback_rdf(); ?>-->

        <?php endwhile; ?>
1 голос
/ 01 мая 2011

После первого цикла попробуйте добавить wp_reset_postdata ();

Я не уверен, пытаетесь ли вы иметь только первый цикл на первой странице, но если это так, попробуйте что-то вроде

$paged = get_query_var('page');

if ($paged < 2) :
     // Put whatever you want to only show up on the first page here
endif;
0 голосов
/ 29 марта 2014

https://wordpress.stackexchange.com/questions/126814/wordpress-static-page-pagination/139594#139594

этот пост решил мою проблему для нескольких циклов с нумерацией страниц.

...