按一个元键查询并按另一个元键排序(可能为空值)

时间:2014-10-07 作者:helgatheviking

我想按1个元键进行查询,但按另一个可能存在或不存在的键进行排序,然后按发布日期进行排序

所以最终的结果是:

元键A/日期1
元键A/日期2
元键B/日期1
无元键/日期1
无元键/日期2

以下查询参数不会返回任何帖子:

$customer_orders = get_posts( array(
    \'numberposts\' => $order_count,
    \'meta_query\' => array(
        array(
            \'key\'     => \'_customer_user\',
            \'value\'   => get_current_user_id(),
            \'compare\' => \'=\',
        ),
        array(
            \'key\'     => \'_dealer_number\',
            \'compare\' => \'EXISTS\',
        ),
        array(
            \'key\'     => \'_dealer_number\',
            \'compare\' => \'NOT EXISTS\',
        ),
        \'relation\' => \'AND\'
    ),
    \'orderby\'    => \'meta_value date\',
    \'order\'      => \'ASC\'
) );
这是否可能与WP_Query args或是否需要筛选posts_orderby? 如果是,我可以使用什么?

2 个回复
最合适的回答,由SO网友:bonger 整理而成

我不认为有一种不使用过滤器的方法可以做到这一点。使用posts_clauses 您可以:

function wpse163696_posts_clauses( $pieces, $query ) {
    if ( $query->get( \'orderby\' ) != \'dealer_date\' ) {
        return $pieces;
    }
    global $wpdb;

    $order = $query->get( \'order\' );
    $pieces[ \'join\' ] .= $wpdb->prepare(
        \' LEFT JOIN \' . $wpdb->postmeta . \' dealer_pm ON dealer_pm.post_id = \' . $wpdb->posts . \'.ID AND dealer_pm.meta_key = %s\'
        , \'_dealer_number\' );
    $pieces[ \'orderby\' ] = \'ISNULL(MAX(dealer_pm.meta_value)) \' . $order . \', MAX(dealer_pm.meta_value) \' . $order  . \', \' . $wpdb->posts . \'.post_date \' . $order;
    return $pieces;
}
然后您的查询变成:

add_filter( \'posts_clauses\', \'wpse163696_posts_clauses\', 10, 2 );
$customer_orders = get_posts( array(
    \'numberposts\' => $order_count,
    \'meta_query\' => array(
        array(
            \'key\'     => \'_customer_user\',
            \'value\'   => get_current_user_id(),
            \'compare\' => \'=\',
        ),
    ),
    \'orderby\'    => \'dealer_date\',
    \'order\'      => \'ASC\',
    \'suppress_filters\' => false,
) );
remove_filter( \'posts_clauses\', \'wpse163696_posts_clauses\', 10 );

SO网友:Biranit Goren

我相信你有几个错误。

1) 没有“numberposts”这样的参数。也许你的意思是“每页帖子数”?这就是您应该用来确定要显示的帖子数量的方法。

2) 按元值排序时,正确的语法应为:

\'orderby\' => \'meta_value\',
\'meta_key\' => \'key_name\', 
其中key\\u name是自定义字段,您将其meta\\u值用于orderby。

因此,根据您的问题,您的查询可能如下所示:

$customer_orders = get_posts( 
                        array(
                            \'posts_per_page\' => $order_count,
                            \'no_found_rows\' => true,
                            \'meta_query\' => array(
                                                array(
                                                    \'key\'     => \'_customer_user\',
                                                    \'value\'   => get_current_user_id(),
                                                    \'compare\' => \'=\',
                                                ),
                                                array(
                                                    \'key\'     => \'_dealer_number\',
                                                    \'compare\' => \'EXISTS\',
                                                ),
                                                array(
                                                    \'key\'     => \'_dealer_number\',
                                                    \'compare\' => \'NOT EXISTS\',
                                                ),
                                                \'relation\' => \'AND\'
                                            ),
                            \'orderby\'    => \'meta_value\',
                            \'meta_key\'   => \'date\',
                            \'order\'      => \'ASC\'
                        ) 
                    );
(请注意,我添加了“no\\u found\\u rows”。如果您知道要查询多少篇文章,并且不需要分页,那么此添加将大大加快您的查询速度)。

结束

相关推荐

WP_USER_QUERY BY META_KEY,即数组

我已设置名为的用户元数据achievements 它是一个包含各种数值的数组。使用WP_User_Query, 我想在此名为points. 以下内容:$args = array( \'order\' => \'DESC\', \'orderby\' => \'meta_value_num\', \'meta_key\' => \'achievements\', \'number\' => $no, \'