WordPress中查询文章的循环Loop结构及用法分析
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来结束循环,所以,一个普通的循环应该是这样的:
<?phpif(have_posts()):?> <ul> <?phpwhile(have_posts()):the_post();?> <li<?phppost_class();?>> <?phpthe_title('<h3>','</h3>');?> </li> <?phpendwhile;?> </ul> <?phpendif;?>
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()方法帮你查询文章。