我运行了你的查询并得到。。。
ORDER BY wp_postmeta.meta_value+0,RAND() DESC
。。。这正是我所期望的。如果我没看错你的问题,你想要的是。。。
ORDER BY wp_postmeta.meta_value+0 DESC,RAND()
。。。比如
this question at SO. 应该按
meta_value
首先,然后随机化任何可能的二级排序。
WP_Query
不会那样做的。You can see in the source 订单“方向”由字符串固定在订单的末尾。它总是在错误的地方结束。
要实现此功能,您需要为posts_orderby
.
function alter_order_wpse_62468($orderby) {
global $wpdb;
remove_filter(\'posts_orderby\',\'alter_order_wpse_62468\');
return "{$wpdb->postmeta}.meta_value+0 DESC, RAND()";
}
add_filter(\'posts_orderby\',\'alter_order_wpse_62468\');
$query = new WP_Query( array( \'post_type\' => \'listing\', \'orderby\' => \'meta_value_num rand\', \'meta_key\' => \'membership\'));
var_dump($query->request);
$query = new WP_Query( array( \'post_type\' => \'listing\', \'orderby\' => \'meta_value_num rand\', \'meta_key\' => \'membership\'));
var_dump($query->request); die;
如果您像这样添加过滤器,就在查询之前,它将运行然后删除自己,这样就不会干扰任何其他查询。您可以通过查看
var_dump
这就是为什么我运行了两次查询。重要的是
add_filter
部分函数本身可以在其他地方定义。
如果在其他地方添加过滤器,则需要在回调中添加一些逻辑来控制其运行的时间和位置,否则它将改变其他查询。作为参考,这里是one technique for adding that logic.
如果过滤器需要使用不同的参数在不同的位置运行,则可能需要对现有的ORDER BY
保留现有内容的条款。