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 相关文章推荐
UCenter Home二次开发指南
May 28 PHP
php array_intersect比array_diff快(附详细的使用说明)
Jul 03 PHP
ajax在joomla中的原生态应用代码
Jul 19 PHP
PHP中echo和print的区别
Aug 28 PHP
PHP中is_dir()函数使用指南
May 08 PHP
使用php-timeit估计php函数的执行时间
Sep 06 PHP
PHP中file_put_contents追加和换行的实现方法
Apr 01 PHP
PHP实现的分页类定义与用法示例
Jul 05 PHP
PHP SFTP实现上传下载功能
Jul 26 PHP
详细解读php的命名空间(二)
Feb 21 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
Jun 13 PHP
ThinkPHP5.0框架实现切换数据库的方法分析
Oct 30 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
PHP 和 MySQL 基础教程(一)
2006/10/09 PHP
php实现自动获取生成文章主题关键词功能的深入分析
2013/06/03 PHP
php中的常用魔术方法汇总
2016/02/14 PHP
如何通过View::first使用Laravel Blade的动态模板详解
2017/09/21 PHP
使用JavaScript 实现对象 匀速/变速运动的方法
2013/05/08 Javascript
JQuery对id中含有特殊字符的转义处理示例
2013/09/06 Javascript
nodejs中的fiber(纤程)库详解
2015/03/24 NodeJs
JavaScript使用指针操作实现约瑟夫问题实例
2015/04/07 Javascript
使用 stylelint检查CSS_StyleLint
2016/04/28 Javascript
BootStrap.css 在手机端滑动时右侧出现空白的原因及解决办法
2016/06/07 Javascript
微信小程序 连续旋转动画(this.animation.rotate)详解
2017/04/07 Javascript
VUE在for循环里面根据内容值动态的加入class值的方法
2018/08/12 Javascript
jQuery实现小火箭返回顶部特效
2020/02/03 jQuery
解决vue+router路由跳转不起作用的一项原因
2020/07/19 Javascript
[02:56]DOTA2亚洲邀请赛 VG出场战队巡礼
2015/02/07 DOTA
Python中应该使用%还是format来格式化字符串
2018/09/25 Python
Python socket模块实现的udp通信功能示例
2019/04/10 Python
Python 3.8中实现functools.cached_property功能
2019/05/29 Python
pyqt5 使用cv2 显示图片,摄像头的实例
2019/06/27 Python
django基于restframework的CBV封装详解
2019/08/08 Python
在 Pycharm 安装使用black的方法详解
2020/04/02 Python
使用Python和百度语音识别生成视频字幕的实现
2020/04/09 Python
Python接口开发实现步骤详解
2020/04/26 Python
Python如何进行时间处理
2020/08/06 Python
python中re模块知识点总结
2021/01/17 Python
CSS3 创建网页动画实现弹跳球动效果
2018/10/30 HTML / CSS
HTML5+CSS设置浮动却没有动反而在中间且错行的问题
2020/05/26 HTML / CSS
Shopee马来西亚:随拍即卖,最佳行动电商拍卖平台
2017/06/05 全球购物
Javascript如何发送一个Ajax请求
2015/01/26 面试题
如何写一个Java类既可以用作applet也可以用作java应用
2016/01/18 面试题
学期自我评价
2014/01/27 职场文书
《小猪家的桃花树》教学反思
2014/04/11 职场文书
万里长城导游词
2015/01/30 职场文书
鸡毛信观后感
2015/06/11 职场文书
Python基础之Socket通信原理
2021/04/22 Python
人民币符号
2022/02/17 杂记