按自定义字段对GET_USERS排序

时间:2013-05-07 作者:fightstarr20

我有一个名为“label”的自定义用户分类法,其中还有一个自定义字段“sort\\u order”-我试图返回具有标签分类法的用户列表,然后按sort\\u order字段对该列表进行排序。

到目前为止,我。。。。。

<?php
$users = get_users(
array(
    \'meta_key\' => \'sort_order\',
    \'fields\' => \'all_with_meta\'
)
);

function wpse98580_sort_order( $a, $b )
{  
    if ( $a->sort_order === $b->sort_order ) {  
    return 0;  
} elseif ( $a->sort_order > $b->sort_order ) {
    return -1;
}
return 1;  
}  
usort( $users, \'wpse98580_sort_order\' );

/* Iterate over the sorted array */

foreach( $users as $user )
{
echo \'<h4>\' . $user_info-> user_firstname . \' \' . $user_info-> user_lastname . \'</h4>\';
}
?>
这行不通,我假设这是因为“sort\\u order”元键实际上是分类法的一个自定义字段,所以它无法检索它。通常我使用以下代码访问sort\\u顺序。。。

$product_terms = wp_get_object_terms($user->ID, \'label\');
                    if(!empty($product_terms)){
                    if(!is_wp_error( $product_terms )){
                        foreach($product_terms as $term){

                        $t_ID = $term->term_id;
                        $label_custom_fields = get_option("taxonomy_term_$t_ID");
                        echo $label_custom_fields[\'sort_order\'];

                        }
                        }
                    }
有人能帮忙吗?

3 个回复
SO网友:kamleshpal

通过使用此选项,可以按sort\\u order自定义字段的升序获得结果

$users = get_users(
   array(
   \'meta_key\'=> \'sort_order\',
   \'orderby\' => \'meta_value_num\',
   \'order\'   => \'ASC\'
   )
);

foreach( $users as $user )
{
   echo \'<h4>\' . $user_info-> user_firstname . \' \' . $user_info-> user_lastname . \'</h4>\';
}

SO网友:Johannes Pille

我注意到get_users 不支持此操作。

不幸的是,这并不需要meta_valuemeta_value_num 作为orderby 参数,正如其与post相关的伙伴所做的那样。

但我们可以指定只获取那些具有meta\\u键值的sort_order 设置:

$users = get_users(
    array(
        \'meta_key\' => \'sort_order\',
        \'fields\' => \'all_with_meta\'
    )
);
get_users() 返回用户对象的数组(WP_User 类)
尽管如此a var_dump of one of those objects will not reveal it, 由于类的神奇方法,用户的元数据可以作为属性访问。

因此,尽管未经测试,但以下内容应按您的意愿对用户进行排序:

function wpse98580_sort_order( $a, $b )
{  
    if ( $a->sort_order === $b->sort_order ) {  
        return 0;  
    } elseif ( $a->sort_order > $b->sort_order ) {
        return -1;
    }
    return 1;  
}  
usort( $users, \'wpse98580_sort_order\' );

/* Iterate over the sorted array */
有关参考,请参见usort.

SO网友:s_ha_dum

有一个操作应该做到这一点。它似乎没有很好的文档记录,但pre_user_query does show up in source.

function alter_user_search($qry) {
  global $wpdb;
  $key = $qry->get(\'meta_key\');
  if (isset($key)) {
//    $qry->query_orderby = preg_replace(\'/ORDER BY (.*) (ASC|DESC)/\',"ORDER BY {$wpdb->usermeta}.meta_value ".$qry->get(\'order\') ,$qry->query_orderby);
    $qry->query_orderby = preg_replace(\'/ORDER BY (.*) (ASC|DESC)/\',"ORDER BY CAST({$wpdb->usermeta}.meta_value AS UNSIGNED) ".$qry->get(\'order\') ,$qry->query_orderby);
  }
//   var_dump($qry); die;
}
add_action( \'pre_user_query\', \'alter_user_search\' );
如果设置了键,这将对元键上的查询进行排序,这可能过于激进,但您可以添加更多条件。这是用我的数据库中的值进行的最低限度测试,但它似乎确实有效(相当肯定)。该查询有两个版本。第二份遗嘱CAST 你的meta_valueINTEGER 因此,您应该得到适当的数字排序。

几乎未经测试。可能是马车排空警告。不退款。

结束

相关推荐

get_users meta_query

我无法使meta\\u查询在get\\u users()上正常工作。我一辈子都不知道自己做错了什么。 $args = array( \'meta_query\' => array( \'relation\' => \'AND\', array( \'key\' => \'minbeds\',&