Code前端首页关于Code前端联系我们

WordPress帖子字段查询meta_query的各种高级用法一览

terry 2年前 (2023-09-24) 阅读数 61 #后端开发

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

在WordPress的get_posts或WP_Query方法中,meta_query可以用来修改无数的高级搜索,这是WordPress的入门技能。

最简单的使用,特殊字段“post_color”的文章查询是“红色”

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

引入meta_compare参数,特殊字段“post_color”的文章查询不是“红色”

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

推荐怎么写

来吧开始进阶使用。首先,我们需要改变编写方式,将所有与自定义字段相关的参数打包到meta_query参数中。效果和上一段是一样的:

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

如果查询中包含多个不同值的 For post_color,meta_value 可以写成一个包含多个值的数组。 Meta_compare 改为 IN

$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

$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”参数用于数字类型列,用途较多,如>=、>= , , strong>, =❀

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

!=
同时指定数值类型 Value,需要添加一个数字参数类型

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

如果要问间隔值,compare写“ANTARA

$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”

ANTARA”也可用于比较日期或时间,只要它们以相同的格式书写即可

$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 );

您还可以比较时间戳。 number,所以还是需要使用数字类型:

$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 个数字作为文章查询的下限和上限,且列值介于这两个数字之间。 。但现实中,这些应用很少出现在业务量大的网站上,因为这样的查询会给数据库带来很大的压力,甚至会导致服务器崩溃。更常见的做法是,上限和下限不作为数字框供用户自由使用,而是改为提供多个选项的选择框,例如0-100、100-1000、1000-5000、 ETC。查询字段也是文本类型区间,这样会减少查询压力。

对于字符字段,您还可以执行类似搜索的查询。 compare的值是LIKE

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

反之,也可以用NOT LIKE

如果只是想问是否有字段,就用,否则也可以用 NOT EXISTS

您甚至可以将它们与正则表达式结合使用

$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 不匹配多个查询 ♻ 不匹配常规查询。 ry

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

$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,♿ ❀ OR :

$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 );

关于排序

根据自定义列值简单排序:

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

如果列值是数字的话,就是这样

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

结合meta_query❀参数写法: :

$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降序排序为第二优先级。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门