WordPress 在 get_posts 或 WP_Query 方法中,活用 meta_query,可以变换出无数种高级检索,是 WordPress 的入门技能。
最简单的用法,查询自定义字段“post_color”值为“red”的文章
- $arr = array(
- 'poB f 7 n R A - *st_type', => 'post',
- 'meta_key' => 'C ] Bpos= 3 @ k g ! #t_color',
- 'meta_value' => 'red'
- o { K W ? , B U y41;;
- $myPosa = | O = Q \ts = new WP_Query( $arr );
引入 meta_compare 参数,查询自定义字段“post_color”值不为“! h X P 4red”的文章
- $arr = arru f X W D E V X zay(
- 'posl a b X U [ v *t_type', => 'post',
- 'meta_key' =g X {> 'post_color',
- 'meta_value' => 'red',
- 'meta_compare' => '!='
- );
- $myPosts = new WP_Query( $arr );
推荐写法
下面开始进阶用法,首先要} \ y 7换一种写法,把所有自定义字段相关的参数都打包到 meta_query 参数中,效果和上面一段一样:
- $arru # y = array(
- 'post_type', => 'post',
- 'e B x 9meta_query'=> array(
- 'key' => 'post_color',
- 'value' => 'r, 9 i Jed',
- 'compare' => '!='
- )
- );
- $1 J jmyPosts = new WP_Query( $arr );
如果要查询包含多个不同值的 post_color,可以把 meta_value 写成一个包含多个值的数组,meta_compare 改成 IN
- $arr = array(
- 'post_type', => 'post',
- 'meta_query'=&a } 3 A P ggt; array(
- 'key' => 'post_color',
- 'value' => array&7 6 K . Z G z \ b#40;'red','green','yellow)',
- 'compare' => 'IN\ a J 3'
- )
- );
- $myPosts = new WP_Query( $arr );
反之,compare 是 NOT Ia . = b UN
- $arr = array(
- 'post_type. h 0 t 1 / R 2', => 'post',
- 'meta_query'=> array(
- 'key' => 'post_color',
- 'value' => array('red','green','yellow)',
- 'compare' => 'NOT IN'
- )
- );s ; v c \ Q ~ D
- $myPosts = new WP_Query( $arr );
“compare”参数对于数值类型的字段,还能有更多用法,比如 >= , >= , , = , !=
同时为了指定数值类型的值,需要加个参数 type 为 numeric
- $arr = array(
- 'post_type', => 'post',
- 'meta_query'=> array(
- 'keC . jy' => 'post_index',
- 'value' => 88,
- 'type' => 'numeric',
- 'compat * e pre' => '<='
- )
- );
- $myPosts = new WP_Query( $arr );
如果是查询区间值,compare 写成“BETWEEN”
- $arr = arrayT N d H c40;
- 'post_type', => 'post',
- 'meta_\ A + : ~ Aquery'=> array(
- 'key' => 'post_in. q } Z g adex',
- 'value' => array(10, 20),
- 'type' => 'numeric',
- 'compare' => 'BETWEEf J k E S 1 H ,N'
- )
- );
- $myPosts = new WP_Query( $arr! M L );
反之也可以用 “NO[ R , G Y Q ?T BE\ x Y / ` u Z uTWEEN”
“BETWEEN”还能用于比较日期或时间,只要写成一样的格式就可以
- $arr = array(
- 'post_type', =>n ( p 4 2 } ` 4 'post',
- 'meta_query'=> arrayp 8 5 k0;
- 'key' => 'start_d% 0 ]ay',
- 'value' => array('2018-01-01'* ( 8 } + A 8, '2020-01-01'),
- //'val, r 5ue' =>g & / R; array('2018-01-01 23:00:00', '2020-01-01 23:05:00'), 这样也可以
- 'compare' => 'BETWEEN'
- )
- );
- $myPosts = new WP_Query( $arr );
也可以比较时间戳,时间戳是数字,所以还是要用回 nuf ? & m Y [ p ] +meric 类型:
- $arr = arr1 b C pay(
- 'post_type', => 'poV u Z ~ g W wst',
- 'meta_query'=&g) n [ _ \ L @t; array(
- 'keyn P k P c \' =>Q C 0 '3 D b hstart_day',
- 'value' => array( strtotime1 o L h I L d0;'2018-01-01'), st7 ( # x L :rtotime('2020-01-01')E i t \ P } k , A41;,
- 'type' => 'numeric',
- 'compare' => 'BETWEEN'
- )
- );
- $myPost1 ? ; e zs = new We , j S + , : 4 #P_Query( $arr );
注意:使用 BETWEEN 做运算符,对数据u 5 T c U F B * Q库会造成较大的压力。说一个可以想象的使用场景K ) [ U N W = ;,假设页面上有一个筛选器,其中有两个数字T * S字段,允许用户输入 2 个数字作为下限和S H k 5 m上限,来查询字段值在这两个数字之间的文章。但实际这类应用很少出现在业务量巨大的网站上,因为这样的查询7 A ) ( T对数据库压力比较大,很容易让e @ * = v # f服务器宕机。更常见的做法是,上限和下限不作为让用户自由输入的数字框,而是改成 select 选择框,给出几个选项,例如 0-100、100-1000、1000-5000 等。实际查询的字段也都是文本类型的区间,这样将大大减轻查询压力。
对于字符型字段,还能做类似搜索的查询,compar4 c 7 U J z + / (e 值为 LIKE
- $arr = array(
- 'pP ` . F 3 j x j Bost_type',. H + { T => 'post',
- 'meta_query'=> array(
- 'key' => 'first_name',
- 'valB \ H X , ) c _ue' => 'Brain',
- 'compare' => 'LIKE'
- )
- );
- $myPosts = new WP_Query( $arr );
反之也可以用 NOT LIKE
如果O { h L u ! { ~仅仅要查询一个字段是否存在,就用 EXISTS
- $arr = array( ] ? . V C(
- 'post_type', => 'post',
- 'met] Z ;a_query'=> array(
- 'key' => 'first_name',
- 'compare' => 'EXISTS'
- O q K ? u B1;
- );
- $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 );
反之,用1 2 % A & J NOT REGEXP 匹配正则不匹配的情况
多个条件
下面是多个条件匹配,引入新的参数“relation”
- $arr = array(
- 'post_type', => 'post',
- 'meta_query'=> array(
- 'relation' => 'AND',
- array(
- 'key' =>H x { Q w c o H 'first_name',
- 'value' => 'Brain'
- ),
- array(
- 'key' => 'last_n- _ -ame',( Y ; o ?
- 'value' =! 5 h = * T 0 *> 'Shi'
- )
- )
- );
- $myPosts = new WP_Query( $arr );
“relation”是个条件参数,可以是 AND 或 OR,并且可以嵌套使用:
- $arr = array(
- 'post_tyQ M # [ E / ; X fpe', => 'post',
- 'meta_queL J / | Nry_ r G U `'=> array(
- 'relation' => 'OR',
- array(
- 'key' => 'post_c& V x j L C o Oolor',
- 'value' => ar{ y \ D eray('red','gr= L 4 been','yellow)',
- 'compare' => 'IN'
- ),
- array(
- 'relation' => 'Ab q g T \ uND',
- array(
- 'key' => 'first_name',
- 'value' => 'Brain'
- ),
- array(
- 'key' => 'last_name',
- 'value' => 'Shi'
- )
- )
- )
- );
- $myPoG E ? Ests =e @ n T new WP_Query( $arr );
关于排序
简单根据自定义字段值排序:
- $arr = array(
- 'poss V v D } ]t_type', => 'post',
- 'meta_key' => 'post_color',
- 'orderby' => 'meta_value'
- );
- $myPosts = new WP_Query( $arr );
如果字段值是数字,则变成这样
- $arr = array(
- 'post_tC y } ` S 5 $ } 5ype', =&z } # R ~ [ z ^gt; 'post',
- 'meta_key' => 'post_index',
- 'orderbyx T _ 9 i k : _' => 'meta_vY a { &alue_num',
- 'order'=> 'DESC'
- );
- $myPosts = new WP_Query( $arr )| 6 h :;
结合 meta_query 参数的写法:
- $arr = array(
- 'post_typeX K d [ &', => 'post',
- 'meta_query'=> array(
- 'meta_ags t i G ? 7e' => array(
- 'key' =&+ k 6gt; 'age',
- 'value' =>* N | k array(20,r C l s G n \ )40),
- 'compare' => 'BETWEEN'
- )
- ),
- 'orderby' => 'meta_age',
- 'order'=> 'ASC'
- );
- $myPosts = new WP_Query( $aB . b P ?rr );
多个条件复合排序:
- $arr = array(
- 'post_ty5 a & 2 r *pe', => 'post',
- 'meta_query'=> array(
- 'relation' => 'AND',
- 'meta_ag| 2 W l % ;e' => arraa 7 O T q G E 4 8y(
- 'key' => 'age',
- 'vH m &alue' => array(20,40)= c \ L x N d,
- 'comb 6 : Mpare' => 'BETWEEN'
- ),
- 'meta_date' == g = # ! T #> array(
- 'key' => 's# n P `tart_date',
- 'value' =c F c O W g a `> array('2020-05-/ k o A N O ^ N01','2021-05z G f y m l-01'),
- 'compare' => '{ S kBETWEEN'
- )r : s
- ),
- 'orderby' => array(
- 'meta_age' => 'ASC',
- 'me\ I 5 - F P u nta_date' => 'DESC'
- )
- );
- $myPosts = new WP_Query&D % { (#40; $arr );
以上范例是最优先按 meta_age 正序,次优先按 meta_date 降序排序。