会员登录 您是新人?

   

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

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

在线留言

您的昵称 *

您的邮箱 *

您的网站

评论内容

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

客服微信