更改WP_QUERY后显示相同帖子的编号分页

时间:2019-09-19 作者:Simo Patrek

我认为标题总结了这个问题,但我将用下面的代码进行更多解释。

如您所见,我正试图从第二篇最新文章开始循环,因为一些主题原因,这迫使我更改了主循环,我使用了参数offset 为了做到这一点,一切都很顺利,但在我继续开发之后,我开始开发编号分页,最后对我修改后的循环在每个页面上显示相同的帖子感到惊讶。

我选择使用WP\\u Query and not touch Query\\u posts(),因为它简单快速,现在我被这个问题困住了,并且测试了所有内容,但都不起作用。

下面是使用类WP\\u Query修改的循环:

<?php
    $paged = get_query_var( \'page\' ) ? get_query_var( \'page\' ) : 1;
    $args = array(
       \'offset\' => 1,
       \'post_type\'  => \'post\',
       \'paged\'      => $paged
    );
    $offset_loop = new WP_Query( $args );
?>
<?php if ( $offset_loop->have_posts() ): ?>
    <?php while ( $offset_loop->have_posts() ): $offset_loop->the_post(); ?>
        <div class="blog_loop_container">
            <article class="blog_post <?php post_class(); ?>" id="post-<?php the_ID(); ?>">
                <div class="post_thumbnail"><?php the_post_thumbnail( \'medium_large\' ); ?></div>
            </article>
        </div>
    <?php endwhile; ?>

    <?php // wp_reset_postdata(); ?>
    <?php echo thegreatguy_pagination(); ?>
<?php endif; ?>
下面是我正在使用的分页函数:

function thegreatguy_pagination() {
    global $wp_query; // Calling The Global Variable Representing WP_Query Class.
    $totalPages = $wp_query->max_num_pages; // Retrieves The Maximum Pages The Blog has.
    $currentPage = max( 1, get_query_var( \'paged\' ) ); // Retrieves The Number Of The Current Page.

    if ( $totalPages > 1 ) { // Check For More Pages To Return.
        return paginate_links( array(
            \'format\'        => \'page/%#%\',
            \'base\'          => get_pagenum_link() . \'%_%\',
            \'current\'       => $currentPage,
            \'prev_text\'     => \'Previous\',
            \'next_text\'     => \'Next\'
        ) );
    }
}

1 个回复
SO网友:Simo Patrek

经过几次检查和测试,我找到了问题的来源并自己解决了它,我将在这里分享它,这样将来任何人都会遇到同样的问题,这肯定会有所帮助。

正如我上面提到的,问题根本不是来自分页,分页被破坏了是的,但破坏它的是WP\\u查询参数offset 因为它覆盖了paged 参数,它是分页的重要参数。

经过几次测试后,我想出了如何在修改WP\\u查询后进行干净且安全的分页,这就是应该如何完成的,我将在下面用干净的代码和解释展示它。

function theme_pagination() {

    global $wp_query;
    $totalPages = $wp_query->max_num_pages ;
    $currentPage = max( 1, get_query_var( \'paged\' ) );

    if ( $totalPages > 1 ) {

    $big = \'9999999\';
    return paginate_links( array(
        \'format\'        => \'page/%#%\',
        \'base\'          => str_replace( $big, \'%#%\', esc_url( get_pagenum_link( $big ))),
        \'current\'       => $currentPage,
        \'total\'         => $totalPages,
        \'prev_text\'     => __( \'Prev\', \'domain\' ),
        \'next_text\'     => __( \'Next\', \'domain\' )
        ) );
    }
}
我想除了参数中给出的函数外,您必须熟悉函数中的几乎所有参数和函数base, 这是必须的,分页才能与搜索页面正常工作,以避免在每个页面中显示相同的帖子。

str_replace( $big, \'%#%\', esc_url( get_pagenum_link( $big ) ) );
如你所知,我的计划是在一个单独的查询中显示一篇特色文章,然后再进行第二次查询以显示其余的文章,而不复制特色文章。

当我第一次尝试让它与offset参数一起工作时,它实际上起了作用,但它不同意让paged参数也起作用,所以我查看并思考了使它在没有offset参数的情况下工作的每一种方法,下面是它如何毫无问题地工作的。

这是显示特色帖子的第一个查询的结构:

$featured_args = array( \'posts_per_page\'    => 1 );
$featured_loop = new WP_Query( $featured_args );

if ( $featured_loop->have_posts() ):
    while ( $featured_loop->have_posts() ): $featured_loop->the_post();
        $do_not_duplicate = $post->ID;

        <article class="featured_post">
            The body of the article goes here...
        </article>
    endwhile; 
    wp_reset_postdata();
endif; ?>
关注变量$do_not_duplicate, 我用它来存储Featured Post\'s ID 在它中,稍后在第二个查询中使用它,如下所示:

Note: 如果要存储两篇文章(在下一个查询中跳转两篇文章),请确保在如下数组中使用它:

$do_not_duplicate[] = $post->ID
下面是第二个查询的外观,这是我们完成全部工作的部分:

if ( have_posts() ): 
    while ( have_posts() ): the_post();
        if ( $post->ID == $do_not_duplicate ) continue; ?>
            <div class="blog_loop_container">
                <article class="blog_post">
                    The body of the articles goes here...
                </article>
            </div>
    <?php endwhile; ?>
    <div class="pagination_container">
        <?php echo theme_pagination(); ?>
    </div>
<?php endif; ?>
在第二个查询中,如您所见,不要更改它,只需使用基本查询,只需记住在打印任何文章正文之前,请确保检查是否有重复的帖子ID,以便跳过它并继续如下操作:

if ( $post->ID == $do_not_duplicate ) continue; ?>
我在第一篇帖子的ID中存储的变量还记得吗?我用它来检查是否有重复的帖子可以跳过。

这是我修复主题、档案、搜索、页面、博客以及主题的每一部分的整个分页的方法,我希望这对您有所帮助,如果有任何问题,请在下面的评论中告诉我,以便我能提供帮助。

相关推荐

Query posts only shows 1

我有一个ID数组:var_dump($userPostsInternal); -> string(13) \"128537,128545\" 那我会的$args = array( \'post__in\' => array($userPostsInternal), \'post_type\' => \'post\', \'posts_per_page\' => -1, ); $q = new WP