Listar usuarios por apellido en WP_User_Query
¿Cómo puedo listar usuarios por apellido en orden ASC cuando uso WP_User_Query?
Existe un parámetro orderby pero al revisar el núcleo no parece aceptar ordenar por metadatos de usuario. ¿Alguien sabe cómo extender WP para permitir este ordenamiento por apellido?

Existe una mejor manera de hacer esto a partir de la versión 3.7 de Wordpress. Utiliza la propiedad meta_key de Wordpress para seleccionar la propiedad del apellido y luego orderby => meta_value con un orden ascendente.
<?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 ) {
// La línea siguiente muestra los datos del autor.
// Usa print_r($author); para mostrar el objeto completo del autor.
?>
<a href="<?php echo get_author_posts_url($author->ID); ?>" class="author" title="Perfil del autor"><?php echo get_avatar($author->ID, 96); ?><?php echo $author->display_name; ?></a>
<?php
}
}
?>

Hice algo por mi cuenta:
Archivo de plantilla de página:
<?php
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$paged -= 1;
$limit = 20;
$offset = $paged * $limit;
$args = array(
'number' => $limit,
'offset' => $offset,
);
// Crear el objeto WP_User_Query
global $wp_query;
$wp_query = new WP_User_Query($args);
// Obtener los resultados
$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>Lo sentimos, no hay publicaciones que coincidan con tus criterios.</p>
</div>
<?php endif; ?>
<?php wp_pagenavi(); ?>
Para que lo sepas, estoy usando una versión alfa de WP-PageNavi que soporta paginación para WP_User_Query. El código anterior solo maneja el diseño y la paginación. A continuación es donde ocurre la magia:
Archivo 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 )) {
// Subconsulta
$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`
";
// Modificar la consulta existente
$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";
}
}
La consulta anterior no es eficiente y sería terriblemente lenta en una base de usuarios grande. En mi caso, estoy trabajando con un máximo de 250 usuarios. Habría mejores formas de hacer esto, pero quería mantener la paginación con WP-PageNavi.

Filtra el string 'query'
y cambia la parte ORDER BY
. Consulta https://gist.github.com/1281778#L160 para ver un ejemplo.
