WP_Query的使用方法

在讲WP_Query之前我们要先区分一下两个名词:

  • WP_Query是WordPress自带的的一个用于处理复杂请求的类(这里的请求的内容不仅包括文章,还可能是页面,用户,分类等其它信息)。
  • $wp_query则是在wp-blog-header.php文件中定义的一个WP_Query实体对象,它提供了当前请求的信息。

访问Wordpress首页或分类页面的时候,Wordpress默认创建一个WP_Query的实例,做为这个页面的主循环。 在查看Wordpress主题源代码时,你经常会看到类似:while( have_posts() ) : the_post(); 的代码。这个就是查找本页面主循环中是否有文章,并予以显示的方法。不过很多时候,除了页面的主循环,我们可以还需要创建自己的查询对象,比方用来显示热门的文章、某人的特定文章等时候。

这里我们主要讲一下WP_Query类有哪些方法和属性。官方文档中,优先描述的是WP_Query的属性,但我觉得从方法入手,更容易让用户理解。

方法

WP_Query类接受一个string或数组类型的查询条件做为其构造函数,除去了它的构造函数,WP_Query内部还包含了13个函数,它们的作用分别如下:

init(): 类内部的初始化函数(注意,不是构造函数),用于初始化对象,清空所有的属性(设为null, 0 或 False)。

parse_query( $query ): parse_query接受一个String类型查询字符串,并将解析后得到的参数赋给类本身。当构造函数中传入的为string类型的参数时,这个方法分被调用,并将string类型的参数转化为数组结构。

parse_query_vars():本身并没做实际工作,只是重新解析了上一个查询函数。相当于调用了不带参数的parse_query。(实际上,源码里就是这么实现的)。

get( $query_var ), set( $query_var, $value ): 单独设置或获取查询条件中的某个属性。不想写一长串难读的查询条件的话,不妨试试用set函数。

&query($query) , &get_posts(): query用于接受查询条件,并从数据库中查找相应的内容。如果内容是文章,第二个方法get_posts则可以用来返回这些文章。注意调用get_posts的同时,会更改对象中的$posts and $post_count两个参数。

have_posts(), the_post(), next_post(), rewind_posts(): WP_Query在查询的时候,会创建一个队列,队列中包含所有查到的文章。这4个方法就是用来对队列进行操作的。名字一目了然,have_posts判断队列中是否还有文章,有的话the_post则拿到当前的文章,next_post让队列向后移一位,rewind_posts则是返回到队列的最开头。

get_queried_object(), get_queried_object_id(): 最开始我们就说过,WQ_Query不仅用来查询文章和页面,还可以用来查询用户、分类等其它信息。这两个方法就是用来判断当前查询的对象,并返回对象或对象的ID。

属性

了解了上面的方法,属性就不难理解了。

$query, $query_vars: WP_Query的查询条件。$query为字符串格式, $query_vars为解析后的数组格式。

$queried_object, $queried_object_id: 对应get_queried_object()和get_queried_object_id()方法。可能是文章、页面、用户、分类。

$posts: 所有被查到的文章。

$post_count, $found_posts, $max_num_pages: 分别为文章总数,查询到的文章数,总页数。

$current_post,$post: 当前文章的序列数和当前的Post对象。

其它的属性还包括:$is_single, $is_page, $is_archive, $is_preview, $is_date, $is_year, $is_month, $is_time, $is_author, $is_category, $is_tag, $is_tax, $is_search, $is_feed, $is_comment_feed, $is_trackback, $is_home, $is_404, $is_comments_popup, $is_admin, $is_attachment, $is_singular, $is_robots, $is_posts_page, $is_paged。通过其名字,基本可以看出它的含义,就不多解释了。

实例

只通过上面的说明,你可能很难知道如何去使用WP_Query,下面我们就通过几个实例让大家更好的了解它。

通过作者获取文章

查询单个作者的文章

根据ID来查找。

$query = new WP_Query( 'author=123' );

根据用户名查找。

$query = new WP_Query( 'author_name=rami' );

查询多个人的文章

$query = new WP_Query( 'author=2,6,17,38' );

查询不属于某个人的文章

可以通过减号“-”来排除某位作者。

$query = new WP_Query( 'author=-12' );

通过分类目录查找

查询某个特定分类下的文章

查询语句中可能会用到以下几个参数:cat, category__name, category__and, category__and, category__in, category__not_in。例子如下:

查询某个分类下的文章(包含它的子分类)

$query = new WP_Query( 'cat=4' ); // 按分类ID
$query = new WP_Query( 'category_name=staff' ); // 按slug

查询某个分类下的文章(不包含它的子分类)

$query = new WP_Query( 'category__in=4' );

类似的,查询多个分类下的文章

$query = new WP_Query( 'cat=2,6,17,38' ); // ID
$query = new WP_Query( 'category_name=staff,news' ); // slug

不包含某个分类

$query = new WP_Query( 'cat=-12,-34,-56' );

查询同时属于多个分类的文章

如下语句,查询同时包含在ID为2和6两个分类的文章。(注意区分: category__in是“或”的关系,cateory__and是“并”的关系。

$query = new WP_Query( array( 'category__and' => array( 2, 6 ) ) ); // 2 and 6
$query = new WP_Query( array( 'category__in' => array( 2, 6 ) ) ); // 2 or 6

同样的,下面的语句就不难理解了。不包含ID为2或6的分类的文章。

$query = new WP_Query( array( 'category__not_in' => array( 2, 6 ) ) );

通过标签查询

可通过标签查询的条件包括:tag, tag_id, tag__and, tag__in, tag__not_in, tag_slug__and, tag_slug__in。

对应到上面分类的查询方法,不难理解每个条件如何使用,我不一一举例了。(注意:名字中没有slug的,用tag的id查询)。

Taxonomy

Taxonomy是一种的通用的分类。Tag和Category其实都可以算在Taxonomy中,实际上Tag和Category也是利用Taxonomy来实现的,你也可以创建自己的一套Taxonomy,有兴趣的话我们可以在以后的文章中继续讨论Taxonomy。利用Taxonomy,你可以够造适合你需求的各种查询函数。这里我们只拿一个较为复杂的例子来说明:

$args = array(
'post_type' => 'post',
'tax_query' => array(
'relation' => 'OR',
array(
'taxonomy' => 'category',
'field' => 'slug',
'terms' => array( 'quotes' )
),
array(
'taxonomy' => 'post_format',
'field' => 'slug',
'terms' => array( 'post-format-quote' )
)
)
);
$query = new WP_Query( $args );

本例为查询“在quotes(分类的slug)分类”下或“post_format”为“post-format-quote”的文章(’post_type’ => ‘post’)。

搜索

WP_Query也提供了一个简单的基于文关键词的搜索功能,参考下面的例子:

$query = new WP_Query( 's=keyword' );

不过,Wordpress只是单单的对字符串进行匹配,不要指望它会有搜索引擎一样的搜索结果。

wordpress教程之WP_Query()类的更多相关文章

  1. wordpress教程之get_posts()

    get_posts 介绍 June 3rd 2012 评论(16) get_posts 函数,简单的来讲是 get_post 的复数新形势,但因为是文章多篇提取,所以使用方法上却略有不同,支持众多参数 ...

  2. wordpress教程之get_option()

    get_option函数的作用 如果你想开发自己的一个wordpress插件,那么也许你有些数据希望保存,这些自定义数据一起都保存在 wordpress数据库的wp_options表,wp_optio ...

  3. wordpress教程之the_author_meta()显示用户的信息

    描述 模板标签函数the_author_meta可以显示用户数据.如果该函数在文章主循环(Loop)中,则不必指定作者的ID值,标签所显示的就是当前文章作者的内容.如果在主循环(Loop)外,则需要指 ...

  4. Nmap扫描教程之DNS服务类

    Nmap扫描教程之DNS服务类 Nmap DNS服务类 DNS(Domain Name System,域名系统)的作用就是将主机名解析为相应IP地址的过程. 通常主机域名的一般结构为:主机名.三级域名 ...

  5. jQuery EasyUI教程之datagrid应用(二)

    上次写到了让数据库数据在网页datagrid显示,我们只是单纯的实现了显示,仔细看的话显示的信息并没有达到我们理想的效果,这里我们丰富一下: 上次显示的结果是这样的 点击查看上篇:jQuery Eas ...

  6. jQuery EasyUI教程之datagrid应用(一)

    最近一段时间都在做人事系统的项目,主要用到了EasyUI,数据库操作,然后抽点时间整理一下EasyUI的内容. 这里我们就以一个简洁的电话簿软件为基础,具体地说一下datagrid应用吧 datagr ...

  7. HealthKit开发快速入门教程之HealthKit数据的操作

    HealthKit开发快速入门教程之HealthKit数据的操作 数据的表示 在HealthKit中,数据是最核心的元素.通过分析数据,人们可以看到相关的健康信息.例如,通过统计步数数据,人们可以知道 ...

  8. HealthKit开发快速入门教程之HealthKit框架体系创建健康AppID

    HealthKit开发快速入门教程之HealthKit框架体系创建健康AppID HealthKit开发准备工作 在开发一款HealthKit应用程序时,首先需要讲解HealthKit中有哪些类,在i ...

  9. 新手教程之:循环网络和LSTM指南 (A Beginner’s Guide to Recurrent Networks and LSTMs)

    新手教程之:循环网络和LSTM指南 (A Beginner’s Guide to Recurrent Networks and LSTMs) 本文翻译自:http://deeplearning4j.o ...

随机推荐

  1. 开心菜鸟系列学习笔记-------javascript(3)

    一.原型链:     1)Object 是一个属性的集合,并且都拥有一个单独的原型对象.,这个原型对象object可以是一个object或者null值 2)不过一般来说,我们会使用__内部属性名__下 ...

  2. Linux下使用VirtualBox安装Windows系统

    (文档比较长,只是写的详细,实际操作起来相对简单.) 由于一些特殊原因,我们并不能完全抛下Windows而使用Linux.VirtualBox 是一款虚拟机软件,支持多系统.在Linux下安装 Vir ...

  3. 25045操作标准子程序集41.C

    /* ;程 序 最 后 修 改 时 间 0-4-3 23:43 ;软 件 标 题:25045操作标准子程序集41 ;软 件 说 明:25045 I2C 串行EEPROM 驱动 ;___________ ...

  4. UVA 10594-Date Flow(无向图的最小费用网络流+题目给的数据有误)

    题意:给一个有N个点的无向图,要求从1向N传送一定的数据,每条边的容量是一定的,如果能做到,输出最小的费用,否则输出Impossible. 解析:由于是无向图,所以每个有连接的两个点要建4条边,分别是 ...

  5. makefile例子《一》

    一.例子 (1)makefile和src源文件不在同一目录下 (2)把.o生成到指定目录下 文件结构目录 ----inc      //放头文件 ----lib //放所需要的.a或者.so文件 -- ...

  6. nyoj 234 吃土豆

    描述 Bean-eating * grid. Now you want to eat the beans and collect the qualities, but everyone must ob ...

  7. hdu 5311 Hidden String(find,substr)

    Problem Description Today is the 1st anniversary of BestCoder. Soda, the contest manager, gets a str ...

  8. Nexus 刷机

    @echo offfastboot flash bootloader bootloader-hammerhead-hhz12k.imgfastboot flash radio radio-hammer ...

  9. 【网络协议】TCP连接的建立和释放

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/29382883 TCP首部格式 先看TCP报文段的格式,例如以下; TCP报文段首部的前20 ...

  10. ios打包应用程序,生成ipa文件

    假设我的程序调试好了,怎么才干发给别人用呢?正常情况下IPA文件是从Xcode的Organizer中输出的,可是我们没有证书,这样输出会产生错误. 以下教你怎样生成ipa文件: 1.到你当前proje ...