本文是《掌握 WP_Query》系列教程的第 1 部分,该系列共包含以下 19 个部分:
- 掌握 WP_Query : 入门介绍
- 掌握 WP_Query:教你使用Loop循环
- 掌握 WP_Query:相关的函数
- 掌握 WP_Query:行动器和过滤器
- 掌握 WP_Query:WP_Query类的属性和方法
- WP_Query 参数:文章、页面和文章类型
- WP_Query 参数:分类和标签
- WP_Query 参数:分类法(Taxonomies)
- WP_Query 参数:自定义字段(Custom Fields)
- WP_Query 参数:日期
- WP_Query 参数:状态、排序和分页
- WP_Query 参数:作者、搜索、密码、权限、缓存和返回字段
- 掌握 WP_Query:10个有用的例子
- 结合 WP_Query 与主查询(the Main Query)
- 掌握 WP_User_Query
- 掌握 WP_Comment_Query
- 掌握 WP_Meta_Query 和 WP_Date_Query
- WordPress 4.1的查询改进
- 掌握 WP_Query:结尾
通常来说,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 将这几个函数做了一个功能演示:
什么时候你可能需要用到WP_Query?
有很多种情况下,使用WP_Query会很有效率。下面尽可能多给大家展示:
- 在当前文章的后面添加一个相关文章的列表——例如:添加一个相关分类的所有文章的列表。
- 在同一页面新建2个循环,例如:在FAQ页面,设置在问题标题处和内容的下面。
- 当小工具(近期文章)显示不出你所需要的内容(或者你是大牛,自己来写的除外^_^),那就用WP_Query来新建一个自定义近期文章列表,放到侧边栏或者网站页脚。
- 创建分类自定义查询,使用多个分类区分要显示的内容。
- 查询文章类型不能够由默认查询而输出的,如:附件生成。
- 由很多种查询生成自定义的内容多样的页面,正如示例程序
注意事项
WP_Query很强大,但是它也有缺点:
- 如果是为了改变文章显示成为特点的类型或者分类,不要用WP_Query。而是,简单的为新的内容或者分类新建一个模板文件,在这个模板文件中设置主循环。
- 如果是在一个归档中展示一小部分文章(例如:不展示特定的分类文章),不要用wp_query去生成一个总的查询。而是用pre_get_posts去修改主查询,利用一些条件标签去定位出你想要修改的内容。
- 一定要警惕在页面上使用过多的查询。理论上,可以在一个页面上使用成百上千个查询,但是请考虑一下你的服务器的负载吧。如果说某个页面需要4到5个查询工作,那么就考虑做一个新的页面模板吧。
小结
WP_Query类是一个强大的丰富的工具,它可以让你自定义页面上的查询,使你的Wordpress网站展现成你所需要的内容。同样,我们也可以使用其他的查询方法,如文章中所介绍的。
在该系列的剩余部分,我们将介绍如何使用wp_query,并且熟悉掌握它。
原文出自:http://code.tutsplus.com/tutorials/mastering-wp_query-an-introduction–cms-23023
由 痴空见观@WordPress大学 原创翻译,未经允许,禁止转载和采用本译文。