WordPress按两个帖子元的总和排序帖子

时间:2020-07-25 05:41:28

标签: wordpress

我知道如何按1个帖子元对帖子进行排序

$query->set('orderby', 'meta_value_num');
$query->set('meta_key', 'thumb_ups');
$query->set('order', 'DESC');

但是我如何才能按2个帖子元的总和进行排序?

例如我想按thumb_ups和thumbs_downs之和排序。

1 个答案:

答案 0 :(得分:0)

如果您想使用WP_Queryget_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查询。

相关问题