我知道如何按1个帖子元对帖子进行排序
$query->set('orderby', 'meta_value_num');
$query->set('meta_key', 'thumb_ups');
$query->set('order', 'DESC');
但是我如何才能按2个帖子元的总和进行排序?
例如我想按thumb_ups和thumbs_downs之和排序。
答案 0 :(得分:0)
如果您想使用WP_Query
或get_posts()
,则只能执行以下操作:
$args = [
'meta_query' => [
'relation' => 'AND',
'thumb_ups' => [
'key' => 'thumb_ups',
'compare' => 'EXISTS',
],
'thumbs_downs' => [
'key' => 'thumbs_downs',
'compare' => 'EXISTS',
],
],
'orderby' => [
'thumb_ups' => 'DESC',
'thumbs_downs' => 'ASC',
],
];
但是您不能同时对thumb_ups和thumbs_downs进行一次计算。如果您想执行类似的操作,则需要执行自己的sql查询或挂接到过滤器(new WP_Query())->get_posts()
您可以尝试这样的脆弱的hack:
$args = [
'meta_query' => [
'relation' => 'AND',
'thumb_ups' => [
'key' => 'thumb_ups',
'compare' => 'EXISTS',
],
'thumbs_downs' => [
'key' => 'thumbs_downs',
'compare' => 'EXISTS',
],
],
'suppress_filters' => FALSE,
];
add_filter('posts_orderby', function ($orderby, $wp_query) {
global $wpdb;
return "({$wpdb->prefix}postmeta.meta_value + mt1.meta_value) DESC, $orderby";
}, 10, 2);
完成后,您需要“取消” suppress_filters并取消设置posts_orderby
过滤器。并假设您的meta_query
字段中没有其他条件。
尽管我认为此hack很脆弱,但我认为此时最好使用$wpdb->get_results()
编写自己的SQL查询。