按META_VALUE_NUM排序的WP_QUERY不获取没有此元字段的帖子

时间:2017-03-23 作者:Bunjip

我有一个自定义用户查询,它应该通过自定义元字段对用户进行排序staff_profile_position. 没有staff_profile_position 不使用此查询获取:

$args = array(
    \'role\'  => \'my_staff_role\',
    \'fields\' => \'all\',
    \'meta_key\' => \'staff_profile_position\',
    \'meta_query\' => array(
        \'relation\' => \'OR\',
        array(
            \'key\'     => \'staff_profile_position\',
            \'compare\' => \'EXISTS\',
        ),
        array(
            \'key\'           => \'staff_profile_position\',
            \'compare\'   => \'NOT EXISTS\',
        ),
    ),
    \'orderby\' => array(
        \'meta_value_num\' => \'ASC\',
    ),
);
如何获取所有用户的订单staff_profile_position, 如果他们有,其他人都跟着?

以上查询如下this answer. 但仍然不起作用,只获取具有此元字段的用户。

1 个回复
最合适的回答,由SO网友:Paul \'Sparrow Hawk\' Biron 整理而成

之所以只获取那些拥有该meta\\u密钥的用户,是因为您包含了\'meta_key\' => \'...\' 在里面$args. 这将结果限制为具有该键的结果,而不管您在meta_query. 这适用于WP_Query, WP_User_QueryWP_Comment_Query.

从WP 4.2开始,您可以在meta_query 然后在orderby 条款,请参见Query improvements in WP 4.2: ‘orderby’ and ‘meta_query’. 不幸的是WP_QueryWP_User_Query 尚未更新以反映这一点,althoWP_Meta_Query 确实涵盖了它。

所以,你可以ALMOST 通过以下方式获得您想要的:

$args = array (
    \'role\'  => \'my_staff_role\',
    \'fields\' => \'all\',
    \'meta_query\' => array (
        \'relation\' => \'OR\',
        \'exists\' => array (
            \'key\' => \'staff_profile_position\',
            \'compare\' => \'EXISTS\',
//          \'type\' => \'NUMERIC\',
            ),
        \'not_exists\' => array (
            \'key\'     => \'staff_profile_position\',
            \'compare\'   => \'NOT EXISTS\',
            ),
        ),
    \'orderby\' => \'exists not_exists\',
    ) ;
Note: 模仿\'orderby\' => \'meta_value_num\' (正如你在问题中所说)你必须包括\'type\' => \'NUMERIC\'meta_query 条款。但是,这会导致所有没有排序的用户排序到顶部,而不是底部(这就是为什么我在上面对其进行了注释)。

因此,如果您可以接受让那些用户将meta\\u键作为字符串而不是数字来排序,那么上述操作就可以了。

如果不能,则必须执行两个单独的查询(一个用于具有meta\\u键的用户,按该键进行数字排序,另一个用于没有meta\\u键的用户),并合并这两个查询的结果。

相关推荐

Get_Terms()Order by Term_Meta

我正在做一个get_terms() 我试图按自定义术语元排序的查询。自定义术语元键是\'order\' 它是一个数值(介于1和10之间)。我尝试了以下方法,但顺序似乎没有遵循元值-任何指针都是值得赞赏的。$type_terms = get_terms( \'type\', array( \'hide_empty\' => false, array( \'key\' => \'order\', ), \'or