WP_Query 是 WordPress 中用于执行自定义查询的类。它允许你根据自定义参数筛选文章,而不是使用默认的所有文章查询。以下是一个使用 WP_Query 的示例,该示例在自定义循环中显示最近的 5 篇文章:

<?php
// 使用 WP_Query 自定义查询参数
$custom_query = new WP_Query(array(
    'posts_per_page' => 5, // 显示 5 篇文章
    'orderby' => 'date',    // 按日期排序
    'order' => 'DESC'       // 降序排列,最近的文章在前
));
// 开始循环
if ($custom_query->have_posts()) : while ($custom_query->have_posts()) : $custom_query->the_post(); ?>
    <div class="post">
        <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
        <p><?php the_excerpt(); ?></p>
        <p>Posted on <?php the_time('F jS, Y'); ?> by <?php the_author(); ?></p>
    </div>
<?php endwhile; else: ?>
    <p>Sorry, no posts to display.</p>
<?php endif; ?>
// 重置查询
wp_reset_postdata();
?>

在这个示例中,我们使用 WP_Query 类来自定义查询参数。我们设置 posts_per_page 为 5,以便只显示最近的 5 篇文章。我们还设置了 orderby 和 order 参数,以按日期降序排列文章。

在自定义循环结束后,我们使用 wp_reset_postdata() 函数重置查询数据,以便在后续的循环中使用默认查询参数。

与 query_posts() 不同,WP_Query 不会改变全局查询,因此它是执行自定义查询的推荐方法。如果你需要按分类筛选文章,可以在 WP_Query 参数中添加 cat 参数,就像在 query_posts() 示例中一样。

为了想完全控制文章循环的数量,WP_Query 可以胜任这一任务,当我尝试去修改默认的循环方式时,它看起来和query_posts非常相似。例如,使用WP_Query排除一些指定的category:

<?php $custom_query = new WP_Query('cat=-9'); // 排除 category 9
while($custom_query->have_posts()) : $custom_query->the_post(); ?>
 
    <div <?php post_class(); ?> id="post-<?php the_ID(); ?>">
        <h1><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h1>
        <?php the_content(); ?>
    </div>
 
<?php endwhile; ?>
<?php wp_reset_postdata(); // reset the query ?>

它接收了与query_posts相同的参数,包括排除或者包括指定categories以及修改显示文章数量上它们基本上时一致的。但是你再看一下下面这几段代码你就会发现在使用自定义循环方面 WP_Query 会方便许多而且也非常容易修改参数。

$custom_query = new WP_Query('cat=-7,-8,-9'); // 排除指定 categories
$custom_query = new WP_Query('posts_per_page=3'); // 限制文章显示数量
$custom_query = new WP_Query('order=ASC'); // 按照正序排序

正如我们所想的那样,WP_Query 可以使用与query_posts 和get_posts相同的组合语法进行循环调用。

$custom_query = new WP_Query('posts_per_page=3&cat=-6,-9&order=ASC');

需要注意的是,无论在什么情况下只要你使用了WP_Query循环,那么我们就不再需要$query_string这个变量了,除了使用WP_Query 自定义默认循环外,我们也可以使用它来自定义更加多样的循环,以下是代码示例:

<?php // 循环1
$first_query = new WP_Query('cat=-1'); 
while($first_query->have_posts()) : $first_query->the_post();
...
endwhile;
wp_reset_postdata();
 
// 循环2
$second_query = new WP_Query('cat=-2'); 
while($second_query->have_posts()) : $second_query->the_post();
...
endwhile;
wp_reset_postdata();
 
// 循环 3
$third_query = new WP_Query('cat=-3'); 
while($third_query->have_posts()) : $third_query->the_post();
...
endwhile;
wp_reset_postdata();
?>

以上每一种循环方式都可以使用到你主题的任何地方,无需为它们进行排序,例如第一个循环可以放在侧边栏的位置,第二个放在页脚的位置等等。每一种循环都很容易使用,你可以输入一些有效的参数对其进行修改。

在什么样的情况下可以使用?

WP_Query 可以用在多样的自定义循环中,通过设置一些额外的功能,你可以创建任意数量的多个循环然后自定义每一种循环的输出方式。

尽管如此,我们也并不需要每一次都派它上场,有些简单循环你可以用默认循环和query_posts()循环就足够了。