WP_Query是WordPress自带的的一个用于处理复杂请求的类(这里的请求的内容不仅包括文章,还可能是页面,用户,分类等其它信息),通过WP_Query类可以创建自己所需要的wordpress循环输出,比如调用最新文章、热门文章、自定义文章类型文章循环输出等,和query_posts()函数具有相同的查询功能,但优于query_posts()函数

访问Wordpress首页或分类页面的时候,Wordpress默认创建一个WP_Query的实例,做为这个页面的主循环。 在查看Wordpress主题源代码时,你经常会看到类似:while( have_posts() ) : the_post(); 的代码。这个就是查找本页面主循环中是否有文章,并予以显示的方法。
语法结构

<?php  
$args = array(
    // 用于查询的参数或者参数集合
); 
 
// 自定义查询
$query = new WP_Query( $args );
 
// 判断查询的结果,检查是否有文章
if ( $query->have_posts() ) :
    // 通过查询的结果,开始主循环
    while ( $query->have_posts() ) :
        $query->the_post(); //获取到特定的文章
        // 要输出的内容,如标题、日期等 
    endwhile;
endif;
// 重置请求数据
wp_reset_postdata(); 
?>

代码中$args是定义的参数变量,而变量$queryWP_Query类的一个实例,然后通过WP_Query的方法开始查询。
在讲更多实例之前,我觉有必要让大家了解下WP_Query类有哪些方法和属性,对类不太熟悉的可以看看这篇文章类与对象
WP_Query类的方法
WP_Query类接受一个string或数组类型的查询条件做为其构造函数,除去了它的构造函数,WP_Query内部还包含了13个函数,它们的作用分别如下:

  1. init(): 类内部的初始化函数(注意,不是构造函数),用于初始化对象,清空所有的属性(设为null, 0 或 False)。
  2. parse_query( $query ): parse_query接受一个String类型查询字符串,并将解析后得到的参数赋给类本身。当构造函数中传入的为string类型的参数时,这个方法分被调用,并将string类型的参数转化为数组结构。
  3. parse_query_vars():本身并没做实际工作,只是重新解析了上一个查询函数。相当于调用了不带参数的parse_query。(实际上,源码里就是这么实现的)。
  4. get( $query_var ), set( $query_var, $value ): 单独设置或获取查询条件中的某个属性。不想写一长串难读的查询条件的话,不妨试试用set函数。
  5. &query($query) , &get_posts(): query用于接受查询条件,并从数据库中查找相应的内容。如果内容是文章,第二个方法get_posts则可以用来返回这些文章。注意调用get_posts的同时,会更改对象中的$posts and $post_count两个参数。
  6. have_posts(), the_post(), next_post(), rewind_posts(): WP_Query在查询的时候,会创建一个队列,队列中包含所有查到的文章。这4个方法就是用来对队列进行操作的。名字一目了然,have_posts判断队列中是否还有文章,有的话the_post则拿到当前的文章,next_post让队列向后移一位,rewind_posts则是返回到队列的最开头。
  7. get_queried_object(), get_queried_object_id(): 最开始我们就说过,WQ_Query不仅用来查询文章和页面,还可以用来查询用户、分类等其它信息。这两个方法就是用来判断当前查询的对象,并返回对象或对象的ID。

WP_Query类属性

  1. $query, $query_vars: WP_Query的查询条件。$query为字符串格式, $query_vars为解析后的数组格式。
  2. $queried_object, $queried_object_id: 对应get_queried_object()和get_queried_object_id()方法。可能是文章、页面、用户、分类。
  3. $posts: 所有被查到的文章。
  4. $post_count, $found_posts, $max_num_pages: 分别为文章总数,查询到的文章数,总页数。
  5. $current_post,$post: 当前文章的序列数和当前的Post对象。
  6. 其它的属性还包括:$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 的所有参数

作者参数 – (int) 显示与某个作者相关的文章。

author – 作者的id,多个id可以用 , 隔开
author_name – 作者的昵称(NOT name)
author__in – 使用作者id(array)包括作者id 3.7以上版本
author__not_in – 使用作者id(array)不包括的作者id 3.7以上版本

实例

$query = new WP_Query( array( 'author' => 3 ) );

$query = new WP_Query( array( 'author' => '2,6,17,38' ) ); //多个作者id

$query = new WP_Query( array( 'author_name' => 'xuxiaoke' ) );

$query = new WP_Query( array( 'author' => -12 ) ); //排除id为12的作者之后的所有文章

$query = new WP_Query( array( 'author__in' => array( 2, 6 ) ) ); //多个id作者的文章

$query = new WP_Query( array( 'author__not_in' => array( 2, 6 ) ) ); //排除id为2 , 6作者的文章

类别参数
显示与某个类别相关的文章。

cat – (int) 类别的id
category_name – (string) – 用类别别名
category__and – (array) – 用类别的id
category__in – (array) – 用类别的id
category__not_in – (array) – 使用类别的id

实例

$query = new WP_Query( array( 'cat' => 4 ) ); //使用类别id显示此类别id的所有文章

$query = new WP_Query( array( 'category_name' => 'staff' ) ); //使用类别别名显示此类别别名的所有文章

$query = new WP_Query( array( 'category__in' => 4 ) ); //显示属于该类别的文章,不包括二级分类

$query = new WP_Query( array( 'cat' => '2,6,17,38' ) ); //使用类别ID显示具有这些类别的文章

$query = new WP_Query( array( 'category_name' => 'staff,news' ) ); //使用类别别名显示具有这些类别的文章

$query = new WP_Query( array( 'category_name' => 'staff+news' ) ); //显示同时属于这两个类别的所有文章

$query = new WP_Query( array( 'cat' => '-12,-34,-56' ) ); //排除拥有这些类别id的文章

$query = new WP_Query( array( 'category__and' => array( 2, 6 ) ) ); //显示同时属于这两个类别的所有文章

$query = new WP_Query( array( 'category__in' => array( 2, 6 ) ) ); //显示属于这些类别的文章

$query = new WP_Query( array( 'category__not_in' => array( 2, 6 ) ) ); //排除属于这些类别的文章

标签参数 
显示与某个标签相关的文章。

tag (string) – 标签别名
tag_id (int) – 标签id
tag__and (array) – 使用标签id
tag__in (array) – 使用标签ids
tag__not_in (array) – 使用标签ids
tag_slug__and (array) – 使用使用别名s
tag_slug__in (array) – 使用使用别名s

实例

$query = new WP_Query( array( 'tag' => 'cooking' ) ); //使用标签别名显示此标签别名的所有文章 

$query = new WP_Query( array( 'tag_id' => 13 ) ); //使用标签ID显示具有此标签的文章

$query = new WP_Query( array( 'tag' => 'bread,baking' ) ); //显示具有这些标签的所有的文章

$query = new WP_Query( array( 'tag' => 'bread+baking+recipe' ) ); //显示同时具有这些标签的所有的文章

$query = new WP_Query( array( 'tag__and' => array( 37, 47 ) ) ); //显示这些标签id的所有的文章

$query = new WP_Query( array( 'tag__in' => array( 37, 47 ) ) ); //显示这些标签id的所有的文章

$query = new WP_Query( array( 'tag__not_in' => array( 37, 47 ) ) ); //排除这些标签id的所有的文章

自定义分类参数
显示与某些自定义分类相关的帖子

tax_query (array) – 使用自定义分类参数,3.1版本以上

field (string) – 选择自定义分类参数,可以用 ‘term_id’, ‘name’, ‘slug’ or ‘term_taxonomy_id’. 默认值 ‘term_id’.

实例

显示在自定义分类people下的标签bob的文章
$args = array(
	'post_type' => 'post',
	'tax_query' => array(
		array(
			'taxonomy' => 'people',
			'field'    => 'slug',
			'terms'    => 'bob',
		),
	),
);
$query = new WP_Query( $args );

显示多个自定义分类下的文章
$args = array(
	'post_type' => 'post',
	'tax_query' => array(
		'relation' => 'AND',
		array(
			'taxonomy' => 'movie_genre',
			'field'    => 'slug',
			'terms'    => array( 'action', 'comedy' ),
		),
		array(
			'taxonomy' => 'actor',
			'field'    => 'term_id',
			'terms'    => array( 103, 115, 206 ),
			'operator' => 'NOT IN',
		),
	),
);
$query = new WP_Query( $args );

搜索参数
基于关键字搜索显示帖子。

s (string) – 搜索关键字

实例

$query = new WP_Query( array( 's' => 'keyword' ) ); //显示与搜索关键词“keyword”匹配的文章

Post & Page 参数 – 显示基于Post & Page的parameters,默认的post-type是post

p (int) – 使用 post id,默认的post type is post.
name (string) – 使用 post 别名.
title (string) – 使用 post 标题,4.4版本以上
page_id (int) – 使用 page id.
pagename (string) – 使用 page 别名.
post_parent (int) – 使用 page id 只返回子页面. 设置为 0 返回顶级页条目
post_parent__in (array) – 使用 post ids 指定父数组位于数组中的位置。(版本3.6以来可用)
post_parent__not_in (array) – 使用 post ids 排除父数组位于数组中的位置。(版本3.6以来可用)
post__in (array) – 使用 post ids
post__not_in (array) – 使用 post ids.
post_name__in (array) – 使用 post slugs

实例

$query = new WP_Query( array( 'p' => 7 ) ); //显示 post by ID:

$query = new WP_Query( array( 'page_id'=>7 ) ); //显示 page by ID:

$query = new WP_Query( array( 'name' => 'about-my-life' ) ); //显示 post by 别名

$query = new WP_Query( array( 'pagename'=>'about-my-life' ) ); //显示 page by 别名

这里暂时翻译这么多吧,更多的内容请查看官方网站 https://codex.wordpress.org/Class_Reference/WP_Query

WP_QUERY运用实例

调用最新10篇post文章,并分页,每页显示10篇
<?php  
$args = array('post_type'=>'post','posts_per_page'=>'10','paged'=>get_query_var('paged')); 
$recentposts = new WP_Query( $args );
if($recentposts -> have_posts()) :
    while($recentposts -> have_posts()) :
        $recentposts -> the_post();
?>		
    <li><a href="<?php the_permalink() ?>" title="<?php the_title(); ?>"><?php the_title(); ?></a></li>
<?php 		
    endwhile;
endif;
wp_reset_postdata(); 
?>