WordPress中查询文章的循环Loop结构及用法分析


Posted in PHP onDecember 17, 2015

WordPress 上获取文章最重要的就是循环(Loop),事实上循环就是去数据库查询到相应的文章,然后暂时储存到全局变量里边,需要的时候一篇一篇的输出出来,WordPress 的循环设计的非常好,完成一次循环需要执行 2000 多行代码,而你在使用循环的时候看到的只是一个简单 while 循环加上几个函数,初学者也很好理解。

<?php
if( have_posts() ):
  while( have_posts() ):
    the_post();
  
  endwhile;
endif;
?>

上边就是一个普通的主循环结构,首先用 have_posts() 函数判断是否有文章,有则用 while 语句循环,在循环体里边调用 the_posts() 函数,the_posts() 函数用来告诉 WordPress 核心的查询类,已经查过一篇文章了,每调用一次 the_posts(),循环中的当前文章就会改变。

当调用几次 the_posts() 之后,文章已经全部循环完毕,就让 have_posts() 函数返回 False 来结束循环,所以,一个普通的循环应该是这样的:

<?php if( have_posts() ): ?>
  <ul>
    <?php while( have_posts() ):the_post();?>
      <li <?php post_class(); ?>>
        <?php the_title( '<h3>', '</h3>' ); ?>
      </li>
    <?php endwhile; ?>
  </ul>
<?php endif; ?>

WP_Query类

循环中所用到的方法都是来自于WP_Query类,这里再对WP_Query类做一下科普:
WP_Query 类的功能包括处理查询条件、去数据库获取文章、整理和储存文章、文章循环、根据文章查询条件判断页面类型。
属性

$query

传入的查询条件。

$query_vars

处理 $query 得到的可以使用的查询条件。

$queried_object

根据查询类型给出的查询归属。比如如果是根据分类查询,那么返回一个包含分类信息的类;如果是标签页则返回包含标签信息的类;作者页等以此类推。

$queried_object_id

返回 $queried_object 的 ID.比如分类就是分类 ID;标签就是标签 ID;以此类推。

$posts

从数据库中查询到的文章和文章信息被以数组的形式储存在这个变量里,每篇文章是一个从 WP_Post 类实例化的对象。

$post_count

当前文章数量,换句话说就是 $posts 变量里存储了几篇文章。

$found_posts

统计如果不启用分页会有多少文章。

$max_num_pages

总页数,当前文章被分成几页。

$current_post

当前文章的索引值。在循环中,开始循环 $current_post 为 ?1,每循环一次则加 1,它表示当前循环到的文章在 $posts 变量(数组)中的索引值。

$post

循环中当前的文章,是一个包含文章和文章信息通过 WP_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

根据查询条件判断当前是什么页面,然后储存在些变量里,详情可以参考 《 WordPress 页面判断函数 》。

方法

init()

初始化对象,所有属性设置为 null、-1、0 或 False,删除一些属性。

parse_query( $query )

解析并保存查询字符串。

parse_query_vars()

在之前的 WordPress 版本中和 parse_query() 一样的功能,现在直接调用 parse_query() 就好了。

get( $query_var )

根据名字获取一个查询条件。

set( $query_var, $value )

设置一个查询条件。

get_posts()

根据现有的查询条件去数据库获取文章,并保存在 $posts 属性里,同时设置好 $post_count 属性。此函数的返回值就是存储文章的 $posts 属性。

next_post()

(循环控制)将 $current_post 加 1,也就是把当前文章向前推进一篇,同时把推进后的当前文章添加到 $post 属性里,然后返回 $post 属性。

the_post()

(循环控制)进入下一篇文章,调用 next_post() 函数,然后把推进后的当前文章导入到全局变量里边。

have_posts()

(循环控制)判断循环是否完成,如果所有文章都循环完毕或者根本就没有文章则返回 False.

rewind_posts()

(循环控制)跳到循环开头。相当于重置 $current_post 属性和 $post 属性。

query( $query )

查询文章,包括调用 init() 方法、parse_query() 方法和 get_posts() 方法,并返回 get_posts() 方法的返回值,用此函数可以完成一个文章查询的完整操作。

get_queried_object()

生成 $queried_object 属性,如果已经存在则直接返回 $queried_object 属性,所以说,因为默认 $queried_object 是不存在的,想要调用 $queried_object 属性一定要直接使用 get_queried_object() 方法。

get_queried_object_id()

生成 $queried_object_id 属性,如果已经存在则直接返回 $queried_object_id 属性。类似 get_queried_object() 方法。

WP_Query( $query = '' ) , __constructor( $query = '' )

WP_Query 类的构造函数,实例化类的时候自己调用,如果你传入一个查询条件,它会自动调用 query() 方法帮你查询文章。

PHP 相关文章推荐
php面向对象全攻略 (二) 实例化对象 使用对象成员
Sep 30 PHP
PHP 时间转换Unix时间戳代码
Jan 22 PHP
基于Zend的Config机制的应用分析
May 02 PHP
PHP限制页面只能在微信自带浏览器访问的代码
Jan 15 PHP
PHP常用正则表达式集锦
Aug 17 PHP
php实现的支持断点续传的文件下载类
Sep 23 PHP
thinkphp视图模型查询提示ERR: 1146:Table 'db.pr_order_view' doesn't exist的解决方法
Oct 30 PHP
php格式输出文件var_export函数实例
Nov 15 PHP
php实现数组按指定KEY排序的方法
Mar 30 PHP
windows 2008r2+php5.6.28环境搭建详细过程
Jun 18 PHP
laravel实现于语言包的完美切换方法
Sep 29 PHP
浅谈laravel框架sql中groupBy之后排序的问题
Oct 17 PHP
WordPress中用于获取文章作者与分类信息的方法整理
Dec 17 #PHP
PHP附件下载中文名称乱码的解决方法
Dec 17 #PHP
WordPress中获取页面链接和标题的相关PHP函数用法解析
Dec 17 #PHP
php提交post数组参数实例分析
Dec 17 #PHP
PHP实现发送邮件的方法(基于简单邮件发送类)
Dec 17 #PHP
PHP响应post请求上传文件的方法
Dec 17 #PHP
CentOS下PHP7的编译安装及MySQL的支持和一些常见问题的解决办法
Dec 17 #PHP
You might like
第4章 数据处理-php字符串的处理-郑阿奇(续)
2011/07/04 PHP
三个类概括PHP的五种设计模式
2012/09/05 PHP
yii2中dropDownList实现二级和三级联动写法
2017/04/26 PHP
PHP实现动态删除XML数据的方法示例
2018/03/30 PHP
js 数据类型转换总结笔记
2011/01/17 Javascript
JavaScript高级程序设计阅读笔记(十六) javascript检测浏览器和操作系统-detect.js
2012/08/14 Javascript
关于锚点跳转及jQuery下相关操作与插件
2012/10/01 Javascript
手机平板等移动端适配跳转URL的js代码
2014/01/25 Javascript
javascript 拷贝节点cloneNode()使用介绍
2014/04/03 Javascript
javascript实现获取cookie过期时间的变通方法
2014/08/14 Javascript
JavaScript中的console.time()函数详细介绍
2014/12/29 Javascript
JQuery遍历DOM节点的方法
2015/06/11 Javascript
使用jQuery监听扫码枪输入并禁止手动输入的实现方法(推荐)
2017/03/21 jQuery
three.js实现3D影院的原理的代码分析
2017/12/18 Javascript
CentOS7中源码编译安装NodeJS的完整步骤
2018/10/13 NodeJs
JavaScript适配器模式原理与用法实例详解
2020/03/09 Javascript
用Javascript实现发送短信验证码间隔功能
2021/02/08 Javascript
python3中bytes和string之间的互相转换
2017/02/09 Python
Python实现的手机号归属地相关信息查询功能示例
2017/06/08 Python
解析Python中的eval()、exec()及其相关函数
2017/12/20 Python
解决seaborn在pycharm中绘图不出图的问题
2018/05/24 Python
Python装饰器语法糖
2019/01/02 Python
关于python下cv.waitKey无响应的原因及解决方法
2019/01/10 Python
python 怎样将dataframe中的字符串日期转化为日期的方法
2019/09/26 Python
使用Python通过oBIX协议访问Niagara数据的示例
2020/12/04 Python
Manuka Doctor美国官网:麦卢卡蜂蜜和蜂毒护肤
2016/12/25 全球购物
澳大利亚领先的女帽及配饰公司:Morgan&Taylor
2019/12/01 全球购物
Unix如何在一行中运行多个命令
2015/05/29 面试题
应届大学生求职信
2013/12/01 职场文书
丑小鸭教学反思
2014/02/03 职场文书
大学班级学风建设方案
2014/05/01 职场文书
供电工程专业求职信
2014/08/09 职场文书
公司领导班子四风对照检查材料
2014/09/27 职场文书
小学数学新课改心得体会
2016/01/22 职场文书
党员干部学习心得体会
2016/01/23 职场文书
升职感谢领导的话语及升职感谢信
2019/06/24 职场文书