会员登录 您是新人?

   

QQ登录

会员注册

       

WP管理员之家

WP_Query、query_posts() 和 get_posts()应该在什么时候使用

WordPress输出文章最常见的函数是query_posts(),但query_posts()不是唯一的方式,而且乱用query_posts()不是一个好习惯。get_posts()或者WP_Query也可以达到相同的作用。看了一篇文章,描述了这三者的区别。

query_posts()

query_posts()主要用来输出主循环,并且会创建很多全局变量。因此不适合到处使用,最佳使用场所就是输出主循环,别的地方能不用就不要用。如果一定要用,记得在输出结果以后使用wp_reset_query()函数重置查询结果,防止意外修改主循环和全局变量产生一堆莫名其妙的错误。

  1. query_posts()是最简单的,但不是首选或最有效率,主要用来改变文章的显示方式。改变主查询,使WordPress用来显示文章。它通过把主查询放到一边,并替换为一个新的查询。在query_posts后需要清理,用wp_reset_query(),使原来的主查询恢复。
  2. 基本结构(无法分页)
  3.  
  4. while ( have_posts() ) : the_post(); ?>
  5. ...
  6. query_posts函数添加在主循环前,如果后面还有循环函数,需要在循环结束后增加来重置query
  7. 控制分类文章
  8.  "cat=1,5,6" ); ?>
  9. 只显示分类ID为1,5,6的文章,要排除分类ID为35的文章只需在分类ID前增加1个减号3,-5′ ); ?>
  10. 显示特定文章
  11.  "p=2" ); ?>
  12. 只显示ID为2的文章
  13. 使用query_posts控制文章数量
  14.  "posts_per_page=5" ); ?>
  15. 显示最多5篇文章
  16. 使用query_posts控制文章排序方式
  17.   "orderby=value" ); ?>
  18. 详见 orderby参数说明
  19. 多参数结构(支持分页)
  20.  
  21. $paged = (get_query_var("paged")) ? get_query_var("paged") : 1;
  22. $args = array(
  23. "orderby" => "rand",
  24. "paged" => $paged
  25. );
  26. query_posts($args);
  27. ?>
  28. 把参数写在’paged’ => $paged上面就可以了,上例中只写了一个文章排序方式为随机的参数,’orderby’ => ‘rand’,每个参数结束后用半角逗号来结束
  29. 使用query_posts控制显示哪些分类,TAG标签或特定的文章
  30.   "category__in" => array( 13)
  31. 只显示分类ID为13的文章,如果需要排除分类ID为24的文章则用’category__not_in’ => array(24),
  32. 要显示某个分类区间的文章,’category__in’ => range(36),显示分类ID3到6的文章。
  33. 同理,需要控制显示哪些TAG标签的文章,只需要将该参数的category改为tag,如’tag__in’ => array( 58),只显示标签ID为58的文章。
  34. 将参数的category改为post则能控制显示哪些ID的文章,’post__in’ => array(2,4,6),只显示ID为2,4,6的文章,如果只想显示置顶文章,则将array(2,4,6)改成get_option(‘sticky_posts’)
  35. 使用query_posts控制文章数量
  36.  "showposts" => 5 或 "posts_per_page" => 5
  37. 显示最多5篇文章,如果把5改成-1,则显示所有文章
  38. 使用query_posts控制显示指定自定义字段的文章
  39.  "meta_key" => "sort",
  40. "orderby" => "meta_value_num",
  41. 只显示自定义字段为sort的文章,且按照sort值的大小来排序,值填写数字就可以按照数字从大到小的顺序排序了,从而可以自由的排序文章。
  42. 在分类页中使用query_posts函数
  43.   "category__in" => array(get_query_var("cat"))
  44. 如果是在分类页中使用,需要调用当前分类的ID,那么直接在array的括号内填写
  45.  get_query_var("cat")
  46. 但是如果该分类有子分类,使用上面的方法并不会显示子分类的文章,想要显示所有子分类的文章就把上面的代码替换为
  47.  "cat" => get_query_var("cat")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//get_posts参数
$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()绝对不是一个想用就能用的功能,乱用这个函数可能产生严重的错误。

http://wordpress.stackexchange.com/questions/1753/when-should-you-use-wp-query-vs-query-posts-vs-get-posts

在线留言

您的昵称 *

您的邮箱 *

您的网站

评论内容

  1. 还没有任何评论,你来说两句吧

客服微信