WP_Query类的基本用法实例讲解

2020年1月19日 飞飞 阅读(1.25K)
知识付费主题,优惠促销中:xx-blog主题

之前转载了一篇 “wp_query所有参数详细注释“,但是并没有说具体的例子,让人看后避免不了有些枯燥,今天重点在举例子。

WP_Query类的介绍

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

访问Wordpress首页或分类页面的时候,Wordpress默认创建一个WP_Query的实例,做为这个页面的主循环。
通过 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中的方法可以参考之前文章。

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。

WP_Query类的属性

$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 的所有参数

1、作者参数 – (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作者的文章

2、显示与某个类别相关的文章。

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 ) ) ); //排除属于这些类别的文章

3、显示与某个标签相关的文章

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的所有的文章

4、显示自定义相关的帖子

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 );

5、基于搜索显示帖子

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

6、基于分页和帖子的内容

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 别名

 


关注微信公众号『xx主题网

第一时间了解最新网络动态
关注博主不迷路~

未经允许不得转载:xx主题网 » WP_Query类的基本用法实例讲解
分享到:

评论抢沙发

要发表评论,您必须先

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

扫码关注微信公众号

扫描关注xx主题网