web-dev-qa-db-fra.com

Liste des utilisateurs par nom de famille dans WP_User_Query

Comment puis-je lister les utilisateurs par nom ASC en utilisant WP_User_Query ?

Il y a un paramètre orderby mais en regardant au cœur, il n'accepte pas de commander mes méta utilisateurs. Quelqu'un sait comment étendre WP pour autoriser cet ordre par nom de famille?

6
Brady

Il existe un meilleur moyen de le faire à partir de Wordpress version 3.7. Utilisez la propriété meta_key de Wordpress pour sélectionner la propriété du nom de famille, puis orderby => meta_value avec un ordre croissant.

<?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 ) {
        // Line below display the author data. 
        // Use print_r($author); to display the complete author object.
        ?>
        <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
    }
} 
?>
8
magi182

Fait quelque chose moi-même:

Fichier de modèle de page:

<?php
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$paged -= 1;
$limit = 20;
$offset = $paged * $limit;

$args  = array(
    'number' => $limit,
    'offset' => $offset,
);

// Create the WP_User_Query object
global $wp_query;
$wp_query = new WP_User_Query($args);

// Get the results
$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>Sorry, no posts matched your criteria.</p>
    </div>
<?php endif; ?>

<?php wp_pagenavi(); ?>

Juste pour que vous sachiez que j'utilise une version alpha de WP-PageNavi qui prend en charge la pagination pour WP_User_Query. Ce qui précède ne concerne que la mise en page et la pagination. Ci-dessous, la magie opère:

Fichier 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 )) {
        // Sub query
        $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`
        ";
        // Modify existing query
        $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 requête ci-dessus n'est pas efficace et serait terriblement lente sur une base d'utilisateurs importante. Dans mon cas, je cours sur 250 utilisateurs max. Il y aurait de meilleures façons de le faire mais je voulais maintenir la pagination avec WP-PageNavi.

4
Brady

Filtrez la chaîne 'query' et modifiez la partie ORDER BY. Voir https://Gist.github.com/1281778#L160 pour un exemple.

2
fuxia