掌握 WP_Query : 入门介绍

17、雨 "哗哗…… "地下起来,就像一个庞大的乐队在地上、空中、屋顶上演奏着秋的交响曲!行道树叶——梧桐叶也伴着秋雨在天空中飘荡,像几只飞舞的蝴蝶在天空中嬉戏!终于,它们飘累了,慢慢地落在了湿漉漉的水泥地上。远远的望去,就像是土地上的几朵小花,给寂寞的秋天增添了几分情趣!
本文是《掌握 WP_Query》专题的第 3 篇,共 19 篇:
  • WP_Query 参数:自定义字段(Custom Fields)
  • WP_Query 参数:分类法(Taxonomies)
  • 掌握 WP_Query : 入门介绍
  • 掌握 WP_Query:教你使用Loop循环
  • 掌握 WP_Query:相关的函数
  • 掌握 WP_Query:行动器和过滤器
  • 掌握 WP_Query:WP_Query类的属性和方法
  • WP_Query 参数:文章、页面和文章类型
  • WP_Query 参数:分类和标签
  • 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包括四个部分:

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

下面我们来举个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?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();

?>

<?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大学 原创翻译,未经允许,禁止转载和采用本译文。

本文掌握 WP_Query : 入门介绍到此结束。天平是轻重的衡量器,实践是是非的试金石。小编再次感谢大家对我们的支持!

标签: WP_Query