web-dev-qa-db-fra.com

Comment afficher des utilisateurs aléatoires avec des avatars

J'ai adapté un peu une fonction pour afficher un certain nombre d'utilisateurs aléatoires avec leurs avatars avec un shortcode. Cela fonctionne, mais quelque chose n'est pas bon. Parfois, il affiche avec un utilisateur inférieur à ce que je veux (juste une ligne vierge à la place du premier utilisateur), parfois il inclut l'administrateur, bien que ce ne soit pas le cas. Quel est le problème avec mon code?

add_shortcode( 'random_users', 'display_random_users' );
//Usage: [random_users how_many = 3]

function display_random_users( $atts ) {

    extract(shortcode_atts( array( "how_many" => '' ), $atts ) );

    $args = array(
        'orderby' => 'ID',
        'role' => 'subscriber',
        'fields' => 'ID'
    );

    $users = get_users( $args );
    $users = array_Rand( $users, $how_many );

    foreach ( $users as $userID ) {
        echo '<a href="' . 
            bp_core_get_user_domain( $userID ) . '">' . 
            bp_core_fetch_avatar( array( 'item_id' => $userID ) ) . '<br />' . 
            xprofile_get_field_data( '1', $userID ) . '</a><br />';
    }
}
3
Iurie Malai

Je ne sais pas pourquoi votre requête renvoie plus d'identifiants que nécessaire. Le $args pour get_users semble correct.

Par défaut, get_users ne supporte pas orderby=Rand, mais vous pouvez écraser cette option. Voir ci-dessous:

function random_user_query( &$query )
{
    $query->query_orderby = "ORDER BY Rand()";
}

// Usage: [random_users how_many = 3]
add_shortcode( 'random_users', 'display_random_users' );
function display_random_users( $atts ) {

    shortcode_atts( array( "how_many" => '', ), $atts );

    // Create a function to override the ORDER BY clause
    add_action( 'pre_user_query', 'random_user_query' );

    $users = get_users( array(
        'role'    => 'subscriber',
        'fields'  => 'ID',
        'orderby' => 'Rand',
        'number'  => $atts['how_many'],
    ) );

    foreach ( $users as $userID ) {
        printf( 
            '<a href="%s">%s<br />%s</a><br />',
            bp_core_get_user_domain( $userID ),
            bp_core_fetch_avatar( array( 'item_id' => $userID ) ),
            xprofile_get_field_data( '1', $userID )
        );
    }

    // Remove the hook
    remove_action( 'pre_user_query', 'random_user_query' );
}

De cette manière, vous interrogez uniquement les utilisateurs de $ how_many, au lieu d'interroger tous les utilisateurs, puis de filtrer $ how_many.

J'ai trouvé ce crochet ici .

5
gdaniel