Сортировка пользователей по фамилии в WP_User_Query
Как я могу вывести список пользователей, отсортированных по фамилии (ASC), используя WP_User_Query?
Есть параметр orderby, но если посмотреть в ядро WordPress, он не поддерживает сортировку по метаданным пользователя. Кто-нибудь знает, как расширить WP для сортировки по фамилии?

Начиная с версии WordPress 3.7 существует более правильный способ сделать это. Используйте свойство meta_key WordPress для выбора свойства фамилии (last_name), а затем orderby => meta_value с сортировкой по возрастанию.
<?php
$args = array(
'meta_key' => 'last_name', // ключ метаполя для фамилии
'orderby' => 'meta_value', // сортировка по значению метаполя
'order' => 'ASC' // сортировка по возрастанию
);
$user_query = new WP_User_Query( $args );
if ( ! empty( $user_query->results ) ) {
foreach ( $user_query->results as $author ) {
// Строка ниже выводит данные автора.
// Используйте print_r($author); для вывода полного объекта автора.
?>
<a href="<?php echo get_author_posts_url($author->ID); ?>" class="author"><?php echo get_avatar($author->ID, 96); ?><?php echo $author->display_name; ?></a>
<?php
}
}
?>

Сделал кое-что сам:
Файл шаблона страницы:
<?php
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$paged -= 1;
$limit = 20;
$offset = $paged * $limit;
$args = array(
'number' => $limit,
'offset' => $offset,
);
// Создаем объект WP_User_Query
global $wp_query;
$wp_query = new WP_User_Query($args);
// Получаем результаты
$authors = $wp_query->get_results();
if($authors): ?>
<div id="staffmembers" class="clearfix">
<?php foreach($authors as $author) : ?>
<a href="<?php echo get_author_posts_url($author->ID); ?>" class="author"><?php echo get_avatar($author->ID, 96); ?><?php echo $author->display_name; ?></a>
<?php endforeach; ?>
</div>
<?php else: ?>
<div class="post">
<p>Извините, нет записей, соответствующих вашим критериям.</p>
</div>
<?php endif; ?>
<?php wp_pagenavi(); ?>
Для вашего сведения: я использую альфа-версию WP-PageNavi, которая поддерживает пагинацию для WP_User_Query. Вышеприведенный код отвечает только за макет и пагинацию. А вот где происходит настоящее волшебство:
Файл functions.php:
add_action('pre_user_query', 'sort_connect_author_list_by_last_name' );
function sort_connect_author_list_by_last_name(&$object) {
global $wp, $wpdb;
if(preg_match( "/^connect(\/.+)?$/", $wp->request )) {
// Подзапрос
$sql = "
(SELECT
`{$wpdb->users}`.`ID` AS `c_user_id`,
MAX(CASE WHEN `{$wpdb->usermeta}`.`meta_key` = 'location' THEN `{$wpdb->usermeta}`.`meta_value` END ) AS `c_location`,
MAX(CASE WHEN `{$wpdb->usermeta}`.`meta_key` = 'last_name' THEN `{$wpdb->usermeta}`.`meta_value` END ) AS `c_last_name`,
MAX(CASE WHEN `{$wpdb->usermeta}`.`meta_key` = 'first_name' THEN `{$wpdb->usermeta}`.`meta_value` END ) AS `c_first_name`
FROM
`{$wpdb->users}`
LEFT JOIN `{$wpdb->usermeta}` ON ( `{$wpdb->users}`.`ID` = `{$wpdb->usermeta}`.`user_id` )
WHERE
1=1
GROUP BY
`{$wpdb->users}`.`ID`
) AS `C`
";
// Модифицируем существующий запрос
$object->query_fields = "SQL_CALC_FOUND_ROWS `{$wpdb->users}`.`ID`, `{$wpdb->users}`.`display_name`";
$object->query_from .= " RIGHT JOIN {$sql} ON ( `{$wpdb->users}`.`ID` = `C`.`c_user_id` )";
$object->query_orderby = "ORDER BY `C`.`c_last_name` ASC";
}
}
Этот запрос неэффективен и будет очень медленным при работе с большой пользовательской базой. В моем случае у меня максимум 250 пользователей. Существуют и более оптимальные способы реализации, но я хотел сохранить пагинацию через WP-PageNavi.

Отфильтруйте строку 'query'
и измените часть ORDER BY
. Пример можно посмотреть по https://gist.github.com/1281778#L160.
