web-dev-qa-db-fra.com

Triez les utilisateurs dans get_users () par ordre personnalisé

<?php
$blogusers = get_users('include=5,6,2,7,12,8');
foreach ($blogusers as $user) {
...         
}
?>

À l'heure actuelle, ces utilisateurs seront triés par prénom.

Comment puis-je trier ceci dans l'ordre où les nombres sont en include=...?

Exemple:

Utilisateur 5 en premier, utilisateur 6 en second, utilisateur 2 en troisième, etc.

3
nicolas

Il existe une méthode plus simple et plus rapide que celle de @Warface. Ceci est une extension à @SyHolloway

Le concept consiste ici à envelopper get_users() dans une nouvelle fonction dans laquelle vous pouvez trier le résultat de get_users() à l'aide du paramètre include à l'aide de usort, puis renvoyer le tableau résultant trié par include.

Cette fonction ne permet pas d'utiliser l'argument fields lorsque le paramètre include a été défini. all est la seule valeur qui fonctionnera. Vous pouvez étendre la fonction pour la faire fonctionner avec les autres valeurs du paramètre fields lorsque include est en cours d'utilisation. Sinon, si include n'est pas défini, le paramètre fields fonctionne normalement.

Naturellement, orderby et order ne fonctionneront pas si include est utilisé

Cette nouvelle fonction fonctionne et est utilisée exactement de la même manière que get_users(), à l’exception des règles mentionnées ci-dessus.

Voici la fonction

function get_users_by_include( $args = array() ) {
    $blogusers = get_users( $args );

    if( isset( $args['include'] ) ){
        $include = $args['include'];
        usort($blogusers, function ($a, $b) use( $include ){
            $q = array_flip( $include ); 
            return $q[$a->ID] - $q[$b->ID];
        });
    }

    return $blogusers;
}

Vous pouvez maintenant utiliser ceci dans votre modèle comme suit

$users = get_users_by_include(array( 'include' => array(2,5,1,10,45,32,66) ) );
foreach ( $users as $user ) {
    echo $user->ID . '</br>';
}
3
Pieter Goosen

Wordpress renvoie un tableau d'objets.
Avez-vous essayé d'utiliser 'orderby' comme paramètre supplémentaire? par exemple

<?php
$blogusers = get_users('include=5,6,2,7,12,8&orderby=id');
foreach ($blogusers as $user) {
    //This will loop in the order of id 2,5,6,7,12  
}
?>

Maintenant que vous savez quel ID sont dans quel ordre, vous pouvez utiliser certaines fonctions de tri des tableaux php

Aussi un peu plus au php maunual

Ce n'est pas une solution totale mais devrait vous mettre sur la bonne voie.

0
Sy Holloway

Puisque WP ne respecte pas l'ordre de tableau injecté dans le tableau include, j'ai créé un petit script pour le réaliser.

$user_id = array(2,5,1,10,45,32,66);

foreach($user_id as $uid):
    $user_query = get_users(array('role'=>'member', 'number' => 1,'include' => $uid));
    echo $user_query[0]->ID // or display_name like you like...
endforeach;

Je sais que c'est un peu boiteux d'interroger chaque fois la base de données mais bon, ça marche.

0
Warface