it-swarm.com.de

Listet Benutzer nach Nachnamen in WP_User_Query auf

Wie kann ich Benutzer nach Nachname ASC auflisten, wenn ich WP_User_Query verwende?

Es gibt einen orderby-Parameter, aber wenn ich in core schaue, kann ich mein Benutzer-Meta nicht bestellen. Weiß jemand, wie man WP erweitert, um diese Sortierung nach Nachnamen zu ermöglichen?

6
Brady

Es gibt einen besseren Weg, um dies ab Wordpress Version 3.7 zu tun. Verwenden Sie die Wordpress-Eigenschaft meta_key, um die Nachname-Eigenschaft auszuwählen und danach orderby => meta_value in aufsteigender Reihenfolge.

<?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

Etwas selbst gemacht:

Seitenvorlagendatei:

<?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(); ?>

Nur damit Sie wissen, dass ich eine Alpha-Version von WP-PageNavi verwende, die Paginierung für WP_User_Query unterstützt. Das Obige befasst sich nur mit Layout und Paginierung. Hier passiert die Magie:

functions.php Datei:

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";
    }
}

Die obige Abfrage ist nicht effizient und würde auf einer großen Benutzerbasis furchtbar langsam sein. In meinem Fall bin ich auf 250 Benutzer max. Es gibt bessere Möglichkeiten, dies zu tun, aber ich wollte die Paginierung mit WP-PageNavi beibehalten.

4
Brady

Filtern Sie die Zeichenfolge 'query' und ändern Sie den Teil ORDER BY. Ein Beispiel finden Sie unter https://Gist.github.com/1281778#L160 .

2
fuxia