WordPress教程

WordPress文章字段查询 meta_query 各种高级用法列举

阿里云

WordPress 在 get_posts 或 WP_Query 方法中,活用 meta_query,可以变换出无数种高级检索,是 WordPress 的入门技能。

最简单的用法,查询自定义字段“post_color”值为“red”的文章

  1. $arr = array(
  2. 	'post_type', => 'post',
  3. 	'meta_key' => 'post_color',
  4. 	'meta_value' => 'red'
  5. );
  6. $myPosts = new WP_Query( $arr );
也想出现在这里?联系我们
创客主机

引入 meta_compare 参数,查询自定义字段“post_color”值不为“red”的文章

  1. $arr = array(
  2. 	'post_type', => 'post',
  3. 	'meta_key' => 'post_color',
  4. 	'meta_value' => 'red',
  5. 	'meta_compare' => '!='
  6. );
  7. $myPosts = new WP_Query( $arr );

推荐写法

下面开始进阶用法,首先要换一种写法,把所有自定义字段相关的参数都打包到 meta_query 参数中,效果和上面一段一样:

  1. $arr = array(
  2. 	'post_type', => 'post',
  3. 	'meta_query'=> array(
  4. 		'key' => 'post_color',
  5. 		'value' => 'red',
  6. 		'compare' => '!='
  7. 	)
  8. );
  9. $myPosts = new WP_Query( $arr );

如果要查询包含多个不同值的 post_color,可以把 meta_value 写成一个包含多个值的数组,meta_compare 改成 IN

  1. $arr = array(
  2. 	'post_type', => 'post',
  3. 	'meta_query'=> array(
  4. 		'key' => 'post_color',
  5. 		'value' => array('red','green','yellow)',
  6. 		'compare' => 'IN'
  7. 	)
  8. );
  9. $myPosts = new WP_Query( $arr );

反之,compare 是 NOT IN

  1. $arr = array(
  2. 	'post_type', => 'post',
  3. 	'meta_query'=> array(
  4. 		'key' => 'post_color',
  5. 		'value' => array('red','green','yellow)',
  6. 		'compare' => 'NOT IN'
  7. 	)
  8. );
  9. $myPosts = new WP_Query( $arr );

“compare”参数对于数值类型的字段,还能有更多用法,比如 >= , >= , < , > , = , !=
同时为了指定数值类型的值,需要加个参数 type 为 numeric

  1. $arr = array(
  2. 	'post_type', => 'post',
  3. 	'meta_query'=> array(
  4. 		'key' => 'post_index',
  5. 		'value' => 88,
  6. 		'type' => 'numeric',
  7. 		'compare' => '<='
  8. 	)
  9. );
  10. $myPosts = new WP_Query( $arr );

如果是查询区间值,compare 写成“BETWEEN”

  1. $arr = array(
  2. 	'post_type', => 'post',
  3. 	'meta_query'=> array(
  4. 		'key' => 'post_index',
  5. 		'value' => array(10, 20),
  6. 		'type' => 'numeric',
  7. 		'compare' => 'BETWEEN'
  8. 	)
  9. );
  10. $myPosts = new WP_Query( $arr );

反之也可以用 “NOT BETWEEN”

“BETWEEN”还能用于比较日期或时间,只要写成一样的格式就可以

  1. $arr = array(
  2. 	'post_type', => 'post',
  3. 	'meta_query'=> array(
  4. 		'key' => 'start_day',
  5. 		'value' => array('2018-01-01', '2020-01-01'), 
  6. 		//'value' => array('2018-01-01 23:00:00', '2020-01-01 23:05:00'),  这样也可以
  7. 		'compare' => 'BETWEEN'
  8. 	)
  9. );
  10. $myPosts = new WP_Query( $arr );

也可以比较时间戳,时间戳是数字,所以还是要用回 numeric 类型:

  1. $arr = array(
  2. 	'post_type', => 'post',
  3. 	'meta_query'=> array(
  4. 		'key' => 'start_day',
  5. 		'value' => array( strtotime('2018-01-01'), strtotime('2020-01-01')),
  6. 		'type' => 'numeric',
  7. 		'compare' => 'BETWEEN'
  8. 	)
  9. );
  10. $myPosts = new WP_Query( $arr );

注意:使用 BETWEEN 做运算符,对数据库会造成较大的压力。说一个可以想象的使用场景,假设页面上有一个筛选器,其中有两个数字字段,允许用户输入 2 个数字作为下限和上限,来查询字段值在这两个数字之间的文章。但实际这类应用很少出现在业务量巨大的网站上,因为这样的查询对数据库压力比较大,很容易让服务器宕机。更常见的做法是,上限和下限不作为让用户自由输入的数字框,而是改成 select 选择框,给出几个选项,例如 0-100、100-1000、1000-5000 等。实际查询的字段也都是文本类型的区间,这样将大大减轻查询压力。

对于字符型字段,还能做类似搜索的查询,compare 值为 LIKE

  1. $arr = array(
  2. 	'post_type', => 'post',
  3. 	'meta_query'=> array(
  4. 		'key' => 'first_name',
  5. 		'value' => 'Brain',
  6. 		'compare' => 'LIKE'
  7. 	)
  8. );
  9. $myPosts = new WP_Query( $arr );

反之也可以用 NOT LIKE

如果仅仅要查询一个字段是否存在,就用 EXISTS

  1. $arr = array(
  2. 	'post_type', => 'post',
  3. 	'meta_query'=> array(
  4. 		'key' => 'first_name',
  5. 		'compare' => 'EXISTS'
  6. 	)
  7. );
  8. $myPosts = new WP_Query( $arr );

反之也可以用 NOT EXISTS

甚至可以结合正则表达式

  1. $arr = array(
  2. 	'post_type', => 'post',
  3. 	'meta_query'=> array(
  4. 		'key' => 'first_name',
  5. 		'value' => '^[A-Z][a-z]*$', //大写字母开头的名字
  6. 		'compare' => 'REGEXP'
  7. 	)
  8. );
  9. $myPosts = new WP_Query( $arr );

反之,用 NOT REGEXP 匹配正则不匹配的情况

多个条件

下面是多个条件匹配,引入新的参数“relation”

  1. $arr = array(
  2. 	'post_type', => 'post',
  3. 	'meta_query'=> array(
  4. 		'relation' => 'AND',
  5. 		array(
  6. 			'key' => 'first_name',
  7. 			'value' => 'Brain'
  8. 		),
  9. 		array(
  10. 			'key' => 'last_name',
  11. 			'value' => 'Shi'
  12. 		)
  13. 	)
  14. );
  15. $myPosts = new WP_Query( $arr );

“relation”是个条件参数,可以是 AND 或 OR,并且可以嵌套使用:

  1. $arr = array(
  2. 	'post_type', => 'post',
  3. 	'meta_query'=> array(
  4. 		'relation' => 'OR',
  5. 		array(
  6. 			'key' => 'post_color',
  7. 			'value' => array('red','green','yellow)',
  8. 			'compare' => 'IN'
  9. 		),
  10. 		array(
  11. 			'relation' => 'AND',
  12. 			array(
  13. 				'key' => 'first_name',
  14. 				'value' => 'Brain'
  15. 			),
  16. 			array(
  17. 				'key' => 'last_name',
  18. 				'value' => 'Shi'
  19. 			)
  20. 		)
  21. 	)
  22. );
  23. $myPosts = new WP_Query( $arr );

关于排序

简单根据自定义字段值排序:

  1. $arr = array(
  2. 	'post_type', => 'post',
  3. 	'meta_key' => 'post_color',
  4. 	'orderby' => 'meta_value'
  5. );
  6. $myPosts = new WP_Query( $arr );

如果字段值是数字,则变成这样

  1. $arr = array(
  2. 	'post_type', => 'post',
  3. 	'meta_key' => 'post_index',
  4. 	'orderby' => 'meta_value_num',
  5. 	'order'=> 'DESC'
  6. );
  7. $myPosts = new WP_Query( $arr );

结合 meta_query 参数的写法:

  1. $arr = array(
  2. 	'post_type', => 'post',
  3. 	'meta_query'=> array(
  4. 		'meta_age' => array(
  5. 			'key' => 'age',
  6. 			'value' => array(20,40),
  7. 			'compare' => 'BETWEEN'
  8. 		)
  9. 	),
  10. 	'orderby' => 'meta_age',
  11. 	'order'=> 'ASC'
  12. );
  13. $myPosts = new WP_Query( $arr );

多个条件复合排序:

  1. $arr = array(
  2. 	'post_type', => 'post',
  3. 	'meta_query'=> array(
  4. 		'relation' => 'AND',
  5. 		'meta_age' => array(
  6. 			'key' => 'age',
  7. 			'value' => array(20,40),
  8. 			'compare' => 'BETWEEN'
  9. 		),
  10. 		'meta_date' => array(
  11. 			'key' => 'start_date',
  12. 			'value' => array('2020-05-01','2021-05-01'),
  13. 			'compare' => 'BETWEEN'
  14. 		)
  15. 	),
  16. 	'orderby' => array(
  17. 		'meta_age' => 'ASC',
  18. 		'meta_date' => 'DESC'
  19. 	)
  20. );
  21. $myPosts = new WP_Query( $arr );

以上范例是最优先按 meta_age 正序,次优先按 meta_date 降序排序。

WordPress 文章字段查询 meta_query 各种高级用法列举

已有 305 人购买
查看演示升级 VIP立刻购买

收藏
(0)

发表回复

热销模板

Ashade - 作品展示摄影相册WordPress汉化主题
LensNews

本站承接 WordPress / PbootCMS / DedeCMS 等
系统建站、仿站、开发、定制等业务!