用get_user()排序姓氏有问题

时间:2016-12-04 03:39:03

标签: php mysql wordpress

我希望我的目录按姓氏排序。我怎样才能做到这一点?

    function dispDirectory()
{
  global $user_ID;

  // Disallow directory if there is a messaging administrator and this person is not it.
  if ($this->admin_user_id && $this->admin_user_id != $user_ID) {
    return '';
  }

  $users = $this->get_users();
  $directory = "";


  foreach($users as $u)
  {
    $firstName = get_user_meta($u->ID, 'first_name', true);
    $lastName = get_user_meta($u->ID, 'last_name', true);         

    $directory .= '<p><strong>'.$lastName.', '.$firstName.'</strong> - <a href="'.$this->actionURL.'newmessage&to='.$u->ID.'">'.__('Send Message', 'cartpaujpm').'</a></p>';
  }
  return $directory;
}

要排序,我尝试在foreach循环之前添加以下内容:

 usort($users, create_function('$a, $b', 'return strnatcasecmp($a->last_name, $b->last_name);'));

这会重新组织列表,但不按字母顺序排列(或者据我所知,任何有用的顺序)

4 个答案:

答案 0 :(得分:3)

在调用get_users()时,您可以传递允许您按元值排序的参数。请参阅this WP Codex

一个例子(未经测试)可能是:

$users = $this->get_users([
    'meta_key' => 'last_name',
    'orderby' => 'meta_value',
    'order' => 'ASC'
]);

我相信您的示例无法正常工作,因为last_name对象(而不是User)上的User Meta属性不存在。

答案 1 :(得分:0)

这是我的解决方案:

function dispDirectory()
{
  global $user_ID;

  // Disallow directory if there is a messaging administrator and this person is not it.
  if ($this->admin_user_id && $this->admin_user_id != $user_ID) {
    return '';
  }

    $args  = array(
        'meta_key' => 'last_name',
    );

    $wp_user_query = new WP_User_Query($args);
    $wp_user_query->query_orderby = str_replace( 'user_login', 'wp_usermeta.meta_value', $wp_user_query->query_orderby );
    $wp_user_query->query();

    $users = $wp_user_query->get_results();


  foreach($users as $u)
  {
    $firstName = get_user_meta($u->ID, 'first_name', true);
    $lastName = get_user_meta($u->ID, 'last_name', true);         

    $directory .= '<p><strong>'.$lastName.', '.$firstName.'</strong> - <a href="'.$this->actionURL.'newmessage&to='.$u->ID.'">'.__('Send Message', 'cartpaujpm').'</a></p>';
  }
  return $directory;
}

答案 2 :(得分:0)

排序get_users():

<? $users = get_users('orderby=meta_value&meta_key=last_name'); ?>

要按姓,然后按名字(如果多个用户具有相同的姓)对get_users()进行排序:

<?
  $users = get_users(array('fields' => 'all_with_meta'));
  usort($users, function($a, $b) { if ($a->last_name.$a->first_name == $b->last_name.$b->first_name) { return 0; } return ($a->last_name.$a->first_name > $b->last_name.$b->first_name) ? 1 : -1; });
?>

答案 3 :(得分:0)

寻找Etienne Dupuis解决方案,我添加了一个名为NIT的meta_key,然后按last_name对结果进行排序,就可以了!

$args = array ( 'meta_key' => 'NIT', 
                'meta_value' => $nit_user);
$users = get_users($args); 
usort(
    $users, 
    function($a, $b) { 
        if ($a->last_name.$a->first_name == $b->last_name.$b->first_name) { 
            return 0; 
        } 
        return ($a->last_name.$a->first_name > $b->last_name.$b->first_name) ? 1 : -1; 
    }
);
if ( ! empty( $users ) ) {
    foreach ( $users as  $the_user ) { 
        //...
    }
}