WP_query wordpress函数中使用了CASE WHEN的SQL查询

gmol1639  于 2022-11-28  发布在  WordPress
关注(0)|答案(1)|浏览(169)

我有这个SQL查询:SELECT * FROMwpgo_postmetaWHEREmeta_key= 'price' ORDER BY CASE WHEN meta_value REGEXP '^[0-9]+$' THEN 1 ELSE 0 END, meta * value+0 DESC; * 这对我来说是有效的,但是我需要转换它,这样它就可以被wordpress的apply_filters函数使用。
我已经尝试了多种方法,包括这个WordPress Query: ORDER BY CASE WHEN
但随后它返回一个空列表。我知道查询有效,因为我已经手动测试过了。
我也试过这个,看起来应该能用,但我也得到了一个空列表。

$query_args['meta_key'] = 'fave_property_price';
$query_args['orderby'] = "CASE WHEN meta_value REGEXP '^[0-9]+$' THEN 1 ELSE 0 END, metavalue+0 DESC;";
c3frrgcw

c3frrgcw1#

看起来您希望数值meta_value结果显示在非数值结果之后。
在SQL中,您可以像这样简化ORDER BY。

ORDER BY (meta_value REGEXP '^[0-9]+$'), meta_value DESC

它之所以有效,是因为布尔比较运算的输出显示为1(真)和0(假)。括号不是绝对必要的,但它们使代码更容易阅读。
但是,你不能把这个SQL风格的子句塞进一个WP_Query()对象中,替换ORDER BY子句是一件棘手的事情。
首先把它转换成一个WP_Query操作。这些东西看起来不像纯SQL。你需要这样的东西,而不是调试。

$q = new WP_Query ( 
   ['meta_key' => 'price',
    'order'    => 'DESC',
    'orderby'  => 'meta_value_num',
   ]);

然后,你会得到按价格排序的帖子,非数字价格的结果很奇怪。运行这个查询,说服自己你得到了你想要的帖子,即使不是完美的顺序。
然后,在posts_orderby过滤器上放置一个过滤器处理程序,并将其放入SQLish自定义排序子句中。您引用的帖子展示了如何做到这一点:WordPress Query: ORDER BY CASE WHEN
使用John Blackbourn的Query Monitor插件,在所有WP_Query代码组装完成后,看看你的查询在现实生活中是什么样子的。正确使用查询过滤器有时会让人感到困惑。
如果代码是诗歌,那么WP_Query代码就是一个神秘的咒语调用圣歌。

相关问题