您现在的位置是:首页 > 学无止境
WordPress文章查询meta_query高级用法
转载自:https://blog.brain1981.com/2394.html
WordPress在get_posts或WP_Query方法中,活用meta_query,可以变换出无数种高级检索,是WordPress的入门技能。
最简单的用法,查询自定义字段“post_color”值为“red”的文章
$arr = array( 'post_type', => 'post', 'meta_key' => 'post_color', 'meta_value' => 'red'); $myPosts = new WP_Query( $arr ); |
引入meta_compare参数,查询自定义字段“post_color”值不为“red”的文章
$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 ); |
如果要查询包含多个不同值的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”参数对于数值类型的字段,还能有更多用法,比如 >= , >= , < , > , = , !=
同时为了指定数值类型的值,需要加个参数type为numeric
$arr = array( 'post_type', => 'post', 'meta_query'=> array( 'key' => 'post_index', 'value' => 88, 'type' => 'numeric', 'compare' => '<=' )); $myPosts = new WP_Query( $arr ); |
如果是查询区间值,compare写成“BETWEEN”
$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”
“BETWEEN”还能用于比较日期或时间,只要写成一样的格式就可以
$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类型:
$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等。实际查询的字段也都是文本类型的区间,这样将大大减轻查询压力。
对于字符型字段,还能做类似搜索的查询,compare值为 LIKE
$arr = array( 'post_type', => 'post', 'meta_query'=> array( 'key' => 'first_name', 'value' => 'Brain', 'compare' => 'LIKE' )); $myPosts = new WP_Query( $arr ); |
反之也可以用 NOT LIKE
如果仅仅要查询一个字段是否存在,就用 EXISTS
$arr = array( 'post_type', => 'post', 'meta_query'=> array( 'key' => 'first_name', 'compare' => 'EXISTS' )); $myPosts = new WP_Query( $arr ); |
反之也可以用 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 匹配正则不匹配的情况
满足多个条件的查询
下面是多个条件匹配,引入新的参数“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,并且可以嵌套使用:
$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( 'meta_age' => array( 'key' => 'age', 'value' => array(20,40), 'compare' => 'BETWEEN' ) ), 'orderby' => 'meta_age', 'order'=> 'ASC'); $myPosts = new WP_Query( $arr ); |
多个条件复合排序:
$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降序排序。
下一篇:一个PHPer眼中的Go语言
文章评论
- 登录后评论
点击排行
-
php-fpm安装、配置与优化
转载自:https://www.zybuluo.com/phper/note/89081 1、php中...
-
centos下postgresql的安装与配置
一、安装(以root身份进行)1、检出最新的postgresql的yum配置从ht...
-
Mysql的大小写敏感性
MYSQL在默认的情况下查询是不区分大小写的,例如:CREATE TABLE...
-
关于URL编码
转载自:http://www.ruanyifeng.com/blog/2010/02/url_encoding....
-
header中的Cache-control
网页的缓存是由HTTP消息头中的“Cache-control”来控制的,常见的...