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

2023-05-2113:39:15后端程序开发Comments1,178 views字数 4124阅读模式

WordPress文章字段查询meta_query各种高级用法列举文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/40994.html

WordPress在get_posts或WP_Query方法中,活用meta_query,可以变换出无数种高级检索,是WordPress的入门技能。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/40994.html

最简单的用法,查询自定义字段“post_color”值为“red”的文章文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/40994.html

$arr = array(
	'post_type', => 'post',
	'meta_key' => 'post_color',
	'meta_value' => 'red'
);
$myPosts = new WP_Query( $arr );

引入meta_compare参数,查询自定义字段“post_color”值不为“red”的文章文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/40994.html

$arr = array(
	'post_type', => 'post',
	'meta_key' => 'post_color',
	'meta_value' => 'red',
	'meta_compare' => '!='
);
$myPosts = new WP_Query( $arr );

推荐写法

下面开始进阶用法,首先要换一种写法,把所有自定义字段相关的参数都打包到meta_query参数中,效果和上面一段一样:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/40994.html

$arr = array(
	'post_type', => 'post',
	'meta_query'=> array(
		'key' => 'post_color',
		'value' => 'red',
		'compare' => '!='
	)
);
$myPosts = new WP_Query( $arr );

 文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/40994.html

如果要查询包含多个不同值的post_color,可以把meta_value写成一个包含多个值的数组,meta_compare改成 IN文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/40994.html

$arr = array(
	'post_type', => 'post',
	'meta_query'=> array(
		'key' => 'post_color',
		'value' => array('red','green','yellow)',
		'compare' => 'IN'
	)
);
$myPosts = new WP_Query( $arr );

反之,compare是 NOT IN文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/40994.html

$arr = array(
	'post_type', => 'post',
	'meta_query'=> array(
		'key' => 'post_color',
		'value' => array('red','green','yellow)',
		'compare' => 'NOT IN'
	)
);
$myPosts = new WP_Query( $arr );

“compare”参数对于数值类型的字段,还能有更多用法,比如 >= , >= , < , > , = , !=
同时为了指定数值类型的值,需要加个参数type为numeric文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/40994.html

$arr = array(
	'post_type', => 'post',
	'meta_query'=> array(
		'key' => 'post_index',
		'value' => 88,
		'type' => 'numeric',
		'compare' => '<='
	)
);
$myPosts = new WP_Query( $arr );

如果是查询区间值,compare写成“BETWEEN文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/40994.html

$arr = array(
	'post_type', => 'post',
	'meta_query'=> array(
		'key' => 'post_index',
		'value' => array(10, 20),
		'type' => 'numeric',
		'compare' => 'BETWEEN'
	)
);
$myPosts = new WP_Query( $arr );

反之也可以用 “NOT BETWEEN文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/40994.html

BETWEEN”还能用于比较日期或时间,只要写成一样的格式就可以文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/40994.html

$arr = array(
	'post_type', => 'post',
	'meta_query'=> array(
		'key' => 'start_day',
		'value' => array('2018-01-01', '2020-01-01'), 
		//'value' => array('2018-01-01 23:00:00', '2020-01-01 23:05:00'),  这样也可以
		'compare' => 'BETWEEN'
	)
);
$myPosts = new WP_Query( $arr );

也可以比较时间戳,时间戳是数字,所以还是要用回numeric类型:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/40994.html

$arr = array(
	'post_type', => 'post',
	'meta_query'=> array(
		'key' => 'start_day',
		'value' => array( strtotime('2018-01-01'), strtotime('2020-01-01')),
		'type' => 'numeric',
		'compare' => 'BETWEEN'
	)
);
$myPosts = new WP_Query( $arr );

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

对于字符型字段,还能做类似搜索的查询,compare值为 LIKE文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/40994.html

$arr = array(
	'post_type', => 'post',
	'meta_query'=> array(
		'key' => 'first_name',
		'value' => 'Brain',
		'compare' => 'LIKE'
	)
);
$myPosts = new WP_Query( $arr );

反之也可以用 NOT LIKE文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/40994.html

如果仅仅要查询一个字段是否存在,就用 EXISTS文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/40994.html

$arr = array(
	'post_type', => 'post',
	'meta_query'=> array(
		'key' => 'first_name',
		'compare' => 'EXISTS'
	)
);
$myPosts = new WP_Query( $arr );

反之也可以用 NOT EXISTS文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/40994.html

甚至可以结合正则表达式文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/40994.html

$arr = array(
	'post_type', => 'post',
	'meta_query'=> array(
		'key' => 'first_name',
		'value' => '^[A-Z][a-z]*$', //大写字母开头的名字
		'compare' => 'REGEXP'
	)
);
$myPosts = new WP_Query( $arr );

反之,用 NOT REGEXP 匹配正则不匹配的情况文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/40994.html

满足多个条件的查询

下面是多个条件匹配,引入新的参数“relation”文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/40994.html

$arr = array(
	'post_type', => 'post',
	'meta_query'=> array(
		'relation' => 'AND',
		array(
			'key' => 'first_name',
			'value' => 'Brain'
		),
		array(
			'key' => 'last_name',
			'value' => 'Shi'
		)
	)
);
$myPosts = new WP_Query( $arr );

“relation”是个条件参数,可以是 AND 或 OR,并且可以嵌套使用:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/40994.html

$arr = array(
	'post_type', => 'post',
	'meta_query'=> array(
		'relation' => 'OR',
		array(
			'key' => 'post_color',
			'value' => array('red','green','yellow)',
			'compare' => 'IN'
		),
		array(
			'relation' => 'AND',
			array(
				'key' => 'first_name',
				'value' => 'Brain'
			),
			array(
				'key' => 'last_name',
				'value' => 'Shi'
			)
		)
	)
);
$myPosts = new WP_Query( $arr );

关于排序

简单根据自定义字段值排序:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/40994.html

$arr = array(
	'post_type', => 'post',
	'meta_key' => 'post_color',
	'orderby' => 'meta_value'
);
$myPosts = new WP_Query( $arr );

如果字段值是数字,则变成这样文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/40994.html

$arr = array(
	'post_type', => 'post',
	'meta_key' => 'post_index',
	'orderby' => 'meta_value_num',
	'order'=> 'DESC'
);
$myPosts = new WP_Query( $arr );

结合meta_query参数的写法:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/40994.html

$arr = array(
	'post_type', => 'post',
	'meta_query'=> array(
		'meta_age' => array(
			'key' => 'age',
			'value' => array(20,40),
			'compare' => 'BETWEEN'
		)
	),
	'orderby' => 'meta_age',
	'order'=> 'ASC'
);
$myPosts = new WP_Query( $arr );

多个条件复合排序:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/40994.html

$arr = array(
	'post_type', => 'post',
	'meta_query'=> array(
		'relation' => 'AND',
		'meta_age' => array(
			'key' => 'age',
			'value' => array(20,40),
			'compare' => 'BETWEEN'
		),
		'meta_date' => array(
			'key' => 'start_date',
			'value' => array('2020-05-01','2021-05-01'),
			'compare' => 'BETWEEN'
		)
	),
	'orderby' => array(
		'meta_age' => 'ASC',
		'meta_date' => 'DESC'
	)
);
$myPosts = new WP_Query( $arr );

以上范例是最优先按meta_age正序,次优先按meta_date降序排序。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/40994.html

  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/bc/40994.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定