通常来说,WordPress会在你所有展现的网页上运行query(查询)功能,查询不同的属性决定了你所看到页面。因此,如果你正在查看一个静态页面,WordPress的运行查询相关ID来显示页面,而如果归档页面被浏览,查询将检索该归档的所有文章。

但有,有的时候我们需要定制内容。这可能是你的文章内容部分或其他页面上的部分(如:侧边栏或页脚),显示一些特定的内容,而不是WP默认查询输出。

有了WP_Query类,这一切都好办了。WP_Query类提供了大量的参数,你可以去设置这些参数来决定什么样的内容将被展示出来(这不仅仅局限于文章页面)。然后,它会运行一个循环函数,来循环展示你所想要展示的内容。

《掌握WP_Query》本系列的学习,共19篇博文。完成本系列的学习,你会从基础入门到精通WP_Query,学会在各种场景下使用WP_Query,轻松使用其完成对Wordpress网站的数据库数据检索/修正功能。

在此文我们将介绍以下内容:

什么是WP_Query?
为什么要使用WP_Query?
潜在的问题/有什么要注意的。

什么是WP_Query?

WP_Query是由WordPress提供的一个类。通过WP_Query,你可以轻松的使用已经集成到WordPress核心代码中的变量、判断和功能,而不必担心自己编写所有的代码。这使你的代码更高效,更可靠。

如果你是个处女座,想知道WP_Query干了嘛,你可以在includes/query.php中看到它的原码。(么担心啦,无病毒啦~~~全世界那么多同志在使用,嘻嘻)

WP_Query包括四个部分:

需要查询的参数,或者参数集合。
开始查询。
循环输出——这将输出文章内容、标题或任何你想显示的内容。
查询结束——通过标签判断、重置请求数据。
下面我们来举个例子:


<?php
 
$args = array(
    // 用于查询的参数或者参数集合
);
 
// 自定义查询
$query = new WP_Query( $args );
 
// 判断查询的结果
if ( $query->have_posts() ) {
 
    // 通过查询的结果,开始主循环
    while ( $query->have_posts() ) {
 
        $query->the_post();
 
        // Contents of the queried post results go here.
 
    }
 
}
 
// 重置请求数据
wp_reset_postdata();
 
?>

你可以在查询的时候去定义需要查询的参数,但是我们不建议这样,我们建议:在查询之前准备好需要查询的参数。保持代码的简洁、易读。

重置请求数据

在例子程序中,我们在每次查询之后添加了wp_reset_postdata()函数,它可以把本次查询的结果传递到页面上主查询中去。

例如,如果你使用WP_Query去展现一组查询数据到侧边栏里,使用wp_reset_postdata()去告诉WordPress哪个页面是我们刚刚访问的页面,并且传递参数至页面的主查询。

如果你不这样做,其他任何页面上运行的查询(包括默认查询)都可能会中止,任何判断页面类型的条件标签都不会正常工作。

为什么要使用WP_Query?

如果你没有使用过WP_Query类,你可能会想为什么要学习它。这里我们将从两个方面进行回答:为什么使用WP_Query 而不使用其他自定义的查询方法;哪些地方你可能会想到用WP_Query。

为什么使用WP_Query 而不使用其他自定义的查询方法?

WP_Query不是仅有自定义查询方法。还有以下四种:

pre_get_posts
get_posts()
get_pages()
query_posts() (不推荐)
以上的方法我们不过多的介绍,但是你有时间去了解一下,也是很有用处的。

pre_get_post 是一个修改主查询的hook(挂钩)。通过条件标签去判断是否有一个确切类型的页面已经展示了出来(如:主页),然后使用pre_get_post去修改查询(如:删除在某个地方展示的最近的3篇博文)。这是非常高效的方式去修改主查询,也是首先应该想到的。但是,不能使用它去创建一个新的查询。
get_posts() 和 get_pages() 除了名字不同,功能类似。这些模板类拓展了WP_Query类,用不同的方式做了同一件事件,当你在调用WP_Query类之前,额外的插入了一步,而非直接插入到wp_query中去。当且仅当查询文章与页面的时候使用get_post和get_paget(),而强大的wp_query,可以包含数据库所有的查询情况。
query_posts() 可以修改主查询(不能在插件和主题中使用)。Query_post()会跳出主查询并重新开始,把主查询给替换掉。很容易报错,特别是标记页码的时候,它会很低效并且使页面加载时间变长。如果需要修改主查询,使用pre_get_post吧。如果你是想重新新建一个查询,请使用wp_query。
在下图中,Andrey “Rarst” Savchenko 将这几个函数做了一个功能演示:
ruikeeducom

什么时候你可能需要用到WP_Query?

有很多种情况下,使用WP_Query会很有效率。下面尽可能多给大家展示:

在当前文章的后面添加一个相关文章的列表——例如:添加一个相关分类的所有文章的列表。
在同一页面新建2个循环,例如:在FAQ页面,设置在问题标题处和内容的下面。
当小工具(近期文章)显示不出你所需要的内容(或者你是大牛,自己来写的除外^_^),那就用WP_Query来新建一个自定义近期文章列表,放到侧边栏或者网站页脚。
创建分类自定义查询,使用多个分类区分要显示的内容。
查询文章类型不能够由默认查询而输出的,如:附件生成。
由很多种查询生成自定义的内容多样的页面,正如示例程序
注意事项

WP_Query很强大,但是它也有缺点:

如果是为了改变文章显示成为特点的类型或者分类,不要用WP_Query。而是,简单的为新的内容或者分类新建一个模板文件,在这个模板文件中设置主循环。
如果是在一个归档中展示一小部分文章(例如:不展示特定的分类文章),不要用wp_query去生成一个总的查询。而是用pre_get_posts去修改主查询,利用一些条件标签去定位出你想要修改的内容。
一定要警惕在页面上使用过多的查询。理论上,可以在一个页面上使用成百上千个查询,但是请考虑一下你的服务器的负载吧。如果说某个页面需要4到5个查询工作,那么就考虑做一个新的页面模板吧。
小结

WP_Query类是一个强大的丰富的工具,它可以让你自定义页面上的查询,使你的Wordpress网站展现成你所需要的内容。同样,我们也可以使用其他的查询方法,如文章中所介绍的。

在该系列的剩余部分,我们将介绍如何使用wp_query,并且熟悉掌握它。