WP_Query、query_posts() 和 get_posts()应该在什么时候使用
WordPress输出文章最常见的函数是query_posts(),但query_posts()不是唯一的方式,而且乱用query_posts()不是一个好习惯。get_posts()或者WP_Query也可以达到相同的作用。看了一篇文章,描述了这三者的区别。
query_posts()
query_posts()主要用来输出主循环,并且会创建很多全局变量。因此不适合到处使用,最佳使用场所就是输出主循环,别的地方能不用就不要用。如果一定要用,记得在输出结果以后使用wp_reset_query()函数重置查询结果,防止意外修改主循环和全局变量产生一堆莫名其妙的错误。
- query_posts()是最简单的,但不是首选或最有效率,主要用来改变文章的显示方式。改变主查询,使WordPress用来显示文章。它通过把主查询放到一边,并替换为一个新的查询。在query_posts后需要清理,用wp_reset_query(),使原来的主查询恢复。
- 基本结构(无法分页)
- <?php query_posts( $args ); ?>
- <?php while ( have_posts() ) : the_post(); ?>
- ...
- <?php endwhile; ?>
- <?php wp_reset_query(); ?>
- query_posts函数添加在主循环前,如果后面还有循环函数,需要在循环结束后增加<?php wp_reset_query(); ?>来重置query
- 控制分类文章
- <?php query_posts( "cat=1,5,6" ); ?>
- 只显示分类ID为1,5,6的文章,要排除分类ID为3和5的文章只需在分类ID前增加1个减号<?php query_posts( ‘cat=-3,-5′ ); ?>
- 显示特定文章
- <?php query_posts( "p=2" ); ?>
- 只显示ID为2的文章
- 使用query_posts控制文章数量
- <?php query_posts( "posts_per_page=5" ); ?>
- 显示最多5篇文章
- 使用query_posts控制文章排序方式
- <?php query_posts( "orderby=value" ); ?>
- 详见 orderby参数说明
- 多参数结构(支持分页)
- <?php
- $paged = (get_query_var("paged")) ? get_query_var("paged") : 1;
- $args = array(
- "orderby" => "rand",
- "paged" => $paged
- );
- query_posts($args);
- ?>
- 把参数写在’paged’ => $paged上面就可以了,上例中只写了一个文章排序方式为随机的参数,’orderby’ => ‘rand’,每个参数结束后用半角逗号来结束
- 使用query_posts控制显示哪些分类,TAG标签或特定的文章
- "category__in" => array( 1, 3)
- 只显示分类ID为1和3的文章,如果需要排除分类ID为2和4的文章则用’category__not_in’ => array(2, 4),
- 要显示某个分类区间的文章,’category__in’ => range(3, 6),显示分类ID3到6的文章。
- 同理,需要控制显示哪些TAG标签的文章,只需要将该参数的category改为tag,如’tag__in’ => array( 5, 8),只显示标签ID为5和8的文章。
- 将参数的category改为post则能控制显示哪些ID的文章,’post__in’ => array(2,4,6),只显示ID为2,4,6的文章,如果只想显示置顶文章,则将array(2,4,6)改成get_option(‘sticky_posts’)
- 使用query_posts控制文章数量
- "showposts" => 5 或 "posts_per_page" => 5
- 显示最多5篇文章,如果把5改成-1,则显示所有文章
- 使用query_posts控制显示指定自定义字段的文章
- "meta_key" => "sort",
- "orderby" => "meta_value_num",
- 只显示自定义字段为sort的文章,且按照sort值的大小来排序,值填写数字就可以按照数字从大到小的顺序排序了,从而可以自由的排序文章。
- 在分类页中使用query_posts函数
- "category__in" => array(get_query_var("cat"))
- 如果是在分类页中使用,需要调用当前分类的ID,那么直接在array的括号内填写
- get_query_var("cat")
- 但是如果该分类有子分类,使用上面的方法并不会显示子分类的文章,想要显示所有子分类的文章就把上面的代码替换为
- "cat" => get_query_var("cat")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
//get_posts参数 <?php $args = array ( 'numberposts' => 5, 'offset' => 0, 'category' => , 'orderby' => 'post_date' , 'order' => 'DESC' , 'include' => , 'exclude' => , 'meta_key' => , 'meta_value' => , 'post_type' => 'post' , 'post_mime_type' => , 'post_parent' => , 'post_status' => 'publish' ); ?> |
get_posts()
get_posts()的机制与query_posts()类似,参数也相同,是一种简单的获取文章的方法,get_posts()不会产生全局变量,不影响主循环,非常安全。如果要在主循环之外输出最新文章、特色文章等,不妨考虑用这个。
WP_Query
WP_Query是前两个函数的基础,使用起来更复杂,但限制也少。适合创建功能比较特殊的自定义循环,也完全可以取代上面两个函数。
关于上述三者的区别,在WordPress Answers网站有很好的讨论,感兴趣的不妨看一下,对于WordPress的数据库交互机制,Sola还有很多不明白的地方,还要努力研究一下。但query_posts()绝对不是一个想用就能用的功能,乱用这个函数可能产生严重的错误。
还没有任何评论,你来说两句吧