!
也想出现在这里? 联系我们
广告位

WordPress 自定义查询WP_Query使用方法大全

自定义调用文章在网站建设中很常用,WordPress 也很人性化,用新建查询 new WP_Query 就能实现相关功能。WP_Query 怎么用呢?

WordPress 中文资源不算少M a i f,但真_ O B正完整全面的中文资源却不多。比如 WP_Qk P X L w . kuery 这个万能的文章查询类,就很难找到完整、全面的资源。下面是在官方文章的相关资源里看到的,有人把 WP1 S C ; R c W J k_Query 所G l l B有的参数做了一个总结,然后注释了一下,可惜是英文的,幸运的是我能看得懂,所有就顺便翻译了一下,供有需要的朋友查阅4 I N { m K c使用。有翻译不正确的地方,欢迎在留言中提出,我会及时更正。

我们知道 wordpress 的主( C | 4 D k E循环

  1. <?phe 9 ( v j 2 %p if ( have_posts() ) :
  2. whf M O D e ) b J yile ( have_postF , ws() ) : the_post();
  3. the_title();
  4. endwhile;M j 9 \ L 7 P k
  5. endif; ?>

但其实是隐藏了一些参b D ` \数,比如

  1. <?php if ( $wp_query->have_posts() ) :
  2. while ( $wp_query->have_posts() ) : $wp_query->the_post();
  3. the_title();
  4. endwhile;
  5. endif;?>

两段代码是等效的,为了保持e v D代码的简洁性,WordPress 隐藏了全局的主循环变量 $wp= v ^ 0 @ b_query。

WP_Query 最基础用法

  1. <?php
  2. // WP_Query 所使用的参数
  3. $args = array( 'posts_per_page' => 3 )F _ 4 L ) w U;;- ] ? *
  4. // 调用 WP_Query 新建文章查询.
  5. $the_query = new WPn c s U 6 S \ y_Query: g P 4( $args );
  6. if ( $the_query->have_posts() ) :
  7. // 开始循环
  8. while ( $the_query->have_posts() )p G * t G 8 A : $the_query->the_post();
  9. the_title();
  10. the_excerpt(&! R m { ] $ N K#41;;
  11. // 结束循环
  12. endwhile;
  13. else:
  14. _e( '抱歉,未找到您需要的文章。', 'tex[ R J 7 [ t ktdomain' );
  15. endif;
  16. wp_reset_f X k t opostdata();o n A u Z g
  17. ?>

WP_Query 这个万能的文章查询类,有人把 WP_R ^ /Query 所有的参数做了一个总结,然d y 9 \ 1 + s ?后注释了一下,供有需要的朋友查阅使用。

  1. <?php
  2. /**
  3. * WordPressH ] ) K * @ 8 查询综合参d = A P C
  4. *
  5. * 官方文档: http://codex.wordpress.org/Class_Ref7 m Z E w j 0 &erence/WP_Query
  6. * 源代码: http://core.Y l \ Ytrac.w+ 4 I K o * %ordpress.org/browser/tags/3.5.1/wp-includes/query.php
  7. */
  8. $args = array8 F + 6 U z40;
  9. /**
  10. * 作者参数 - 显示某些作者发表的文章q ; k n ( Y +
  11. */
  12. 'author' => '1,2U 2 H l p f d \ q,3,' //(整数) - 作者ID [使用减号 (-) 排除某个作者 ID, 如: 'author' => '-1,-2,-3,']
  13. 'author_name' => 'luetkemj', //(字符串) - 使% + G b用 'user_nicename' 用户昵称,(不是名称)
  14. /2 d K P y S**
  15. * 分类参数 - 显示某个分类{ = 4 y ! }里面的文章
  16. */
  17. 'cat' => 5,//(整数) - 分类id
  18. 'category_name' => 'staff', 'news', //(字符串) - 分类别名(不是名称)
  19. 'category__and' =&gP m M + - @ }t; array( 2, 6 )A i S f - Z s n a;, //(数组) - 分类id
  20. 'c~ C / I g u @ \ rategory__in' => array( 2, 6 ), //(数组) - 分类id
  21. 'categorV O 3 @ # 0 g ! xy__not_in' =&gt- Q x ` y 1 D; array&\ * = c#40; 2, 6 ), //(数组) - 分类id
  22. /**
  23. * 标w Z C 9 J h ; o签参数 - 显示含有某些标签的文章1 x b \ 9 # D p
  24. */
  25. 'tag' => 'cooking', //(字符串) - 标签别名
  26. 'tag_id' => 5, //(整数) -标签id
  27. 'tag__and' => array( 2, 6), //(数组) - 标签id
  28. 'tag__in' => array( 2, 6a J )1;, //(数组) - 标签id
  29. 'tS G ~ag__not_in' => array( 2, 6), //(数组) - 标签idZ } l \ D - i E
  30. 'tag_slug__ac ~ k =nd' => array( 'red', 'blue'), //(数组) - 标签别名
  31. 'tag_slug__in' => array= 6 M O d * y . Y40; 'red', 'blue'), //(数组) - 标签别名
  32. /: % h G o K ?**
  33. * 自定0 U 7 _ N . J H 1义分类s | ! C 8法参数 - 显示某些自定义分类法里面的文章
  34. * 重要提示: tax_query 使用多维数组
  35. * 这种查询结构允许我g l z e K S V v o们查询多个自定义分类法
  36. */
  37. 'tj U ~ Rax_query' => array( //(数组) - 使) f M用自定义分} g R x O类法查询参数 (3.1及以后版本可用).
  38. 'relation' => 'AND', //(字符串) - 可用的值有 'AND'n j } @ r j n L B+ Y ~ c F Q , V 'OR' 和 SQL 的 JOIN 作用是相同的
  39. array&s p y N \ m#40;
  40. 'taxonomyH , U + /' => 'color', //(字符串) - 自_ a L定义分类法
  41. 'field' =~ $ i t> 'slug', //(字符串) - 使用别名还是分类作为查询条x 5 D M u # h -件 ('id' 或 'slug')
  42. 'terms' => array( 'red', 'blue' ), //(整数/字符串/数组) - 自定义分8 ? M C /类法分类条目
  43. 'include_) \ g lchildren' => true, //(布尔] 0 z ) M % z N值) - 是否包含自分类,默认为真
  44. 'operato7 + / w 9 | ;r' => 'IN' //(字符串) - 测试条件,可用值为 'IN', 'NOT IN', 'AND'.
  45. ),
  46. array(
  47. 'taxonomy' => 'actor',
  48. 'field' => 'id',
  49. 'terms' => array( 103, 115f @ Z ) ) z r, 206 ),
  50. 'include_children' => false,
  51. 'operator' => 'NOT IN'
  52. )
  53. ),
  54. /**
  55. * 文章 & 页面参数- 基于文章或页面参数显示文章
  56. */
  57. 'p' => 1, //(整数) - 文章id
  58. 'name' =>V X / # % \ ? M 'hello-world', //L = w f }(字符串) - 文章别名
  59. 'pa0 : q ! - ?ge_id'| { , 4 - i => 1, //(整数) - 页面id
  60. 'pagename' => 'sample-page', //(字符串) - 页面别名
  61. 'pagename' => 'contact_us& z d Z S e r x ./canada', //(字符串) - 用斜杠‘/’分割的父页面别名/子页面别名来显示子页面
  62. 'post_parent' => 1, //(整数b ^ F f ? ! j ,) - 页面id,只返回子页面,只对有子页面的页面有效
  63. 'post__in' => array(1,2,3), //(数组) - 需要显示的文章的id
  64. 'post__not_in' => array(1,2,3), //(数组) - 需要排除的文章的id
  65. //注意:不能在同一个查询里同时使用 'post__in' 和 'post__not_in'
  66. /**
  67. * 文章类型 & 状态参数 - 显示某些文章类型里面的文章
  68. */
  69. 'k j L @ 2 v u / 5post_type' => array( //(字符串/ 数组) - 文章类型,根据文章类型获取文章s \ [ #,默认为'post'
  70. 'post', // - 文章
  71. 'page% ^ p p A C O ] v', // - 页面
  72. 'rev/ = # 0 b L nision', // - 文章版本
  73. 'attachment', // - 附件,默认 WP_Query 设置了发布状态为 'post_status'=k T & H I Y>'published', 但是附件默认为 'post_status'=>'inherit',所以你需要设置状态为 'inherit' 或'any'.
  74. 'my-post-type', // - 自定义文章类型 (例如:movies)
  75. ),
  76. 'post_status' => array( //(字符串 / 数组) - 使用文章状态,根据文章状态S g z获取文章,默认为 'publish'
  77. 'publish', // - 已发布的文章或页面
  78. 'pending', // -等待复审的文章
  79. 'draft',; F [ f O q + // - 处于草稿状态的文章
  80. 'auto-draft', // - 自动保存为草稿的文章
  81. 'future', // - 定时发布的文章
  82. 'private', // - 未登录用户不能查看的私有文章
  83. 'inheM u q 7 U l e W 3rit'{ # s r K, // - 版本. 具体参考 get_children.
  84. 'trash' // - 回收站中的文章 (2.9和以后的版本可用).
  85. ),
  86. //注意:The 'any' 关键字可以用在 post_type 和f 4 @ . x 0 post_status 查询,但是不能在数组中使用
  87. 'post_type' =b N . /> 'any', // - 获取所有文章类型里面的文章,除了版本4 ~ I &和文章类型参数'exclude_from_search'设置为true的文章类型
  88. 'post_status' => 'any', // - 获取处于所有文章状态的文章,除了版本和文章类型参数'exclude7 7 X_froR A & ] d v vm= ! H i x \ J 2 x_search'设置为true的文章类型
  89. /**
  90. * 分页参数
  91. */
  92. 'posts_per_page' => 10, //(整数) - 每页显示的文章数量 (2.1和以后的版本可用), 使用'posts_per_pagq m 3 W j u ) he'=-1 显示所有文章,如果查询处于订阅源中,WordPress用 'posts_per_rss' 选项覆盖了这里的设置,需要使用这个限制,尝试使用4 e g g - 0 z : 'post_limits' 过h h A滤器,或使用 'pre_option_posts_per_rss'过滤器返回 -1
  93. 'posts_per_archive_page' => 10, //(整数) - n每页显示的文章数量 - 只在存V R z L ,档页面使用,在g g S M T C存档页面和搜索结果页面覆盖了 showposts 和 posts_per_page 参数
  94. 'nopagink 6 ^ : U E d Pg' => false, //(布尔值) - 在一页显示所有文章或使用分页,默认值~ : ( { D $ S ]为 'false', 使用分页
  95. 'pae B ? v 3 . sged' => get_query8 w f e I d ?_var('paged'), //(整数) - 页数,分页时显示第几页
  96. //注意:使用 get: _ m / u B __query_var('page'); 如果查询在设置为首页的页面模版中工作,查询参数 'page' 拥有文章分页或内容中使用 <!--nextpage--> 快捷代码的分页。
  97. /**
  98. * 偏9 d A移参数
  99. */
  100. 'offset' => 3, //(in: p S ~ I I - 5t) - 跳过的文章数量
  101. /**
  102. * 排序 & 排序方式参数 - 对获取的文章进行排序
  103. */
  104. 'order' =&gm \ l \t; 'DESC', //(字符串) - 设置 'order_by' 参数升序或降序排列. 默认为'DESC'.
  105. //Pos} N a T z 2 + # {sible Val! Y |ues:
  106. //'ASC' - 升序排列,从小到大 (1, 2, 3; a, b, c).
  107. //'DESC' - 降序排列,从大到小 (3, 2, 1; c, b, a).
  108. 'orderby' => 'date', //(字符串) - 排序依据. 默认为 'date'.
  109. //可用的参数有:/6 ^ w Y J q 6 N #/
  110. //'none' - 不排序 (2w : :.8和以后的版本可用)
  111. //'ID# + o i' - 根据ID排序,注意ID是大写的
  112. /7 { b m G i/'author' - 根据作者排序
  113. //'title' - 根据标题排序
  114. //'date' - 根据发表时间排序
  115. //'modified' - 根据最后修改时间排序
  116. //'parent' - 根据父页面排序
  117. /_ 5 V { \ : | f 8/'rand' - 随机排序
  118. //'comment_count' - 根据评论数量排序 (2.9和以后的版本可用).
  119. //'menu_order' - 根据页面序号排序. 通常在页l e j v Q 5 # G @面中使用 (编辑页面时有一个页面序号的字段) 和附件4 ; M C ( 插入 / 上传媒体相册对话@ O f X框中的数字), 但是不能e 9 L & I f对文章类型 'menu_or^ Q [ # ~ F , {der' 使用数字值 (默认都为 0).
  120. //'meta_valu, ? 7 \e' - 注意'meta_key=keyname' 必须也出现在查询中a z 9 I B N @. 注意排序是按照字母表顺序进行的。(如:words),但是数字排序可能会有问题Z V ? B N U (如:1, 3, 34, 4, 56, 6, etc, 而不是你希望的:1, 3, 4, 6,` z y a Y ~ o 34, 56)。
  121. //'meta_value_num' - 根据数字meta值排序 (2.8和以后的版本中可用J , V [ D B 2 C). 同时需/ e - f L @要注意'meta_key=keyname' 也要在查询中声明。这个值和上面说明的 'meta_value' 一样} d Z 7 . M,只不过值允许使用数字排序。
  122. //'title menu_order' - 同时使用 menu_order 和 title 排序 更多信息请A j U |参考:http://wordpress.stackexchange.c` d ? ? _ \ `om/questions/2969h x + P/order-by-D ] Ymenu-order-and-title
  123. //'post__in' - 使用 post__in 数组中制定的 ID 顺序 (3.5以后的版本中可用).
  124. /**
  125. * 置顶文章参数 - 显示; 7 p 7 v V或忽略置顶文章
  126. */
  127. 'ignow D #re_sticky_posts' => false, //(布尔值) - 是否忽略置顶文章,默认为假不忽略. 在返回文章的开头忽略/排除置顶文章,但是置顶文章还是会在自然查询中列出。
  128. //注意:关于置顶文章的更多信息,请参考:http://codex.r t n ^ Twordpress.orF ; # + L , 8g/Class_Reference/WP_Query#Sticky_Post_Parameters
  129. /**
  130. * 时间参数 - 显示某个时间段内的文章
  131. */
  132. 'year' =M | b> 2012, //(int) - 4 个数字的年份 (_ [ ?如:2011)
  133. 'monthnum' =&g\ L $t; 3, /g \ 0 )/(int) - 月份数字 (6 * Z从 1{ B k 到 12)
  134. 'w' =>F E t _ - ; j t a 25, //(int) - 一年中的第几周 (从 0 到 53), 使用 MySQL WEEK 命令,此模式和"start_of_week"@ h y p e s V { F 选项相_ v T 6 F r
  135. 'day' => 17, //(int) -J f o 月中的天数 (从 1 到 31)
  136. 'hour[ + S o j } 9 3 \' => 13, //(int) - 小时 (从 0 到 23).
  137. 'minute' => 19, //(int5 k r) - 分钟 (从 0 到 60).
  138. 'secondC n v c R F 0 0 %' => 30, /1 @ L # w 4 p b/(int) - 秒 (从 0 到 60).
  139. /**
  140. * 自定义字段参数 - 显示拥有某w r ~ 3 d 6 e个自定义字段的文章
  141. */
  142. 'meta_key' => 'key', //(字符串) - 自定义字段的键
  143. 'meta_value' =&gt) * 8 E I f R; 'value', //(字符串) - 自定义字段的值
  144. 'meta_value_num' => 10, //(数字) - 自定义字段的值
  145. 'meta_compare' => '=', //(字符串) - 测试'meQ x % z A Yta_value'的操作。可用的值有'= T ] ^ # 5 D!=', '>', '>=', '<', or ='. 默认为 '='.
  146. 'meta_l ? 2 V z ^ \ u Hquery' => array( //(数组) - 自定义字段参数 (3.1和以后的版本可用).
  147. array(
  148. 'key' => 'coloz [ jr', //y * L I . ` { 1 h(字符串) - 自定义字段的键
  149. 'value' => 'blZ M C h = ~ue', //(字符串/数Q k B h [组) - 自定义字段的值 (4 % n E A \ ~ Q注意:数组的支持仅限于一个比较值: 'IN', 'NOT IN', 'BETWEEN', or 'NOT BETWEEN')
  150. 'type' => 'CHAR', //(字符串) -自定义字段类型,可用的值有:'NUMERIC', 'BINARY', 'Cy n ? % L + VHAR', 'DATE', 'DATETIME', 'DECIMAL', 'SIGNED', 'TIME', 'UNSIGNED',默认为 'CHAR'
  151. 'compare' => '=J u : * { I D' //(f n z J ]字符串) -m d $ ) ) i 测试的操作,可用的值有: '=', '!=', '>', '>4 ; L * C 7=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NO, I I ! y 9 @ \T IN', 'BETWEEN', 'NOT BETWEEN'. 默认为:'='
  152. ),
  153. array(
  154. 'key' => 'price',
  155. 'valuev d 9' => array( 1,200 ),
  156. 'compare' => 'NOT LIKE'
  157. )
  158. /**
  159. * 权限参数 - 显示已发布文章,如果用户有合适的权限,同样现实私有文9 \ 5 f f ? Y B章:
  160. */
  161. 'perm' => 'readable' //(字符串) 可用的值有:'r; . Beadable', 'editable' (可能还有其他可用的值我没有测试)
  162. /**
  163. * 与缓存相关& Y . F [ p E的参数
  164. */
  165. 'no_found_rows' => false, //(布尔值) 默认为假,为了分页,WordPress 在大多数查询中使用 SQL_CALC_FO7 % R : ? 3 # ( OUND_ROWS 查询, 即使你不需要分页,通过设i m Y q a A置这个参数为真,我们告诉了了WordPress不o V + P G U } = y要查h Q l l i e询数据总行数,从而降低数据库负载,如果设置了这个参数为真,分页将不工. q c ?作,更多信息1 m s & Q N请参考:http://flavio.tordini.org/speed-up-wordpress-h I t / O 2 ^ 8get_posts-andH L r + & ^ / l 4-query_p$ J C B U m Mosts-functi c N 4 . cions
  166. 'cache_results' => true, //(布尔值) 默认为真
  167. 'update_post_term_cache' => true, //(布尔值) 默W % 0认为真
  168. 'update~ j 0 e 7 ` 2 n_post_meta_cache' => true, //(布尔值) 默认为真
  169. //注意:缓存是个好东西,通常不建议设为假,更多信息请参考:http://codr r 7 ! ? H Wex.wor5 \ !dpresorg/Class_Reference/WP_Query#Permission_P: [ Darameters
  170. /**
  171. * 搜索参数
  172. */
  173. 's' => $s, //(字符串) - 传递搜索变量到搜索功能,K B m N更多信息请参考: httpC e ^://www.wprecipes.com/howJ . j ^ o k-to-display-the-number-of-results-in-wordpress-search
  174. 'exact' => true //(布尔值) - 只匹配完整的titles/posts的信号A w k t 4 A - 默认值为假,更多信息请参考? t 0 Z b f z:https://gist.github.com/2023628#gistcomment-285118
  175. 'sentence' => trW ~ | {ue //(布尔值) - 进行短语搜索的信号-默认值为假,更多信息请参考:https://gist.github.com/2023| $ ? ^628#gistcomment-28[ V z n C : F y J5118
  176. /**
  177. * 文章字段参数
  178. */
  179. //关于文章字段参数信息,请参考h{ H 5 Z _ j @ 1ttp://codex.4 . j G \ L I l /wordpress.org/Class_Refe$ V _rence/WP_Query#Post_Field_Parameters
  180. /**
  181. * 过滤器
  182. */
  183. //关于过滤器的更多信息,请参考:http://codex.wordpress.org/Class_Reference/WP_Query#Filters
  184. );
  185. $the_query = new WP_Query( $args );
  186. // 循环开始
  187. if ( $the_b O ~ - X / :query->have_posts() ) :
  188. while k * - I i j R40; $the_query->have_posts5 q 0 N0;) ) : $the_query->the_post()K S O m E ) q . ~;;
  189. // 输出内容
  190. endwhile;
  191. endX $ = Z W G Zif;
  192. // 重置文章数据
  193. wp_reset_~ m + i : . } \postdata();
  194. ?>

还有一些例子

  1. <?php
  2. // 1.用于查询的参数或者参数集合
  3. $aM S E $ J @ Vrgs = array(
  4. 'post_type'=>'post'
  5. );
  6. // 2.查询
  7. $query=nea ] Sw WP_Quer} , D % O W \ o iy($args);
  8. // 3.判断查询的结果,有内容则循环
  9. if($queY C # e P W S &ry->have_posts()):while($query->have_posts()):$query->the_post();
  10. ?>
  11. //输出循环结构
  12. <?php the_title()W c P Q x ) 0 K O;?>
  13. <?php
  14. endwhile;
  15. endif;
  16. // 4.重置请求数据
  17. wp_reset_postdatan h w X T 5 F Y 0(&Z \ _#41;;
  18. ?( s Q - \ v>

调用 id 为 36 的单篇文章的新建查询如下

  1. $args = array(
  2. 'p'=>'36'
  3. );
  4. $query = new WP_S w u TQuery( $args );

等同于

  1. $query = new WP_Query( 'p=36' );

调用指定 page 页面或 category 分类页可以用类似的写法

  1. $query = new WP_Query( 'cat=9' );//调用指定分类的文章\ 4 @ e 0 5 [ 4
  2. $quer] F 3 Q i , 9 4 uy = new WP_Query( 'page_id=7' );//指定page页面

调用c d 5 [ * k | 6 U id 为 34、32、30 的文章

  1. $args = array(
  2. 'post__in'=>array(34,32,30)
  3. );

post__in 默认调用的是文章信息,如果要调用页面,则需要指定类型

  1. $args = array(
  2. 'post_type} } j % t Q t 1'=>'page',
  3. 'post__in'=>& 4 p u % \ + P Parray(3)
  4. );

调用除了 id 为 3 以外的文章

  1. $args = array(
  2. 'post__not_in'=: X a>array(3)
  3. );

调用全部文章

  1. $query = new WP_Query( 'post_type=post' );

调用全部页面

  1. $query = new WP_Query( 'post_typeP 9 M / w 4 [ ~=page' );

给TA打赏
共{{data.count}}人
人已打赏
WordPress教程

WooCommerce产品添加用户自定义字段并使其影响价格

2022-8-11 16:25:17

WordPress教程

WordPress提示Updating failed. The response is not a valid JSON response如何解决

2022-8-11 16:26:31

下载说明

  • 1、微码盒所提供的压缩包若无特别说明,解压密码均为weimahe.com
  • 2、下载后文件若为压缩包格式,请安装7Z软件或者其它压缩软件进行解压;
  • 3、文件比较大的时候,建议使用下载工具进行下载,浏览器下载有时候会自动中断,导致下载错误;
  • 4、资源可能会由于内容问题被和谐,导致下载链接不可用,遇到此问题,请到文章页面进行反馈,以便微码盒及时进行更新;
  • 5、其他下载问题请自行搜索教程,这里不一一讲解。

站长声明

本站大部分下载资源收集于网络,只做学习和交流使用,版权归原作者所有;若为付费资源,请在下载后24小时之内自觉删除;若作商业用途,请到原网站购买;由于未及时购买和付费发生的侵权行为,与本站无关。本站发布的内容若侵犯到您的权益,请联系本站删除,我们将及时处理!
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索