web-dev-qa-db-ja.com

ランダムなユーザーをアバターで表示する方法

私は少し 機能 をショートコードで彼らのアバターでランダムなユーザーの数を表示するために適応させました。それは動作しますが、何かが良くありません。ときどき1人のユーザーが最初のユーザーの代わりに空白行で表示されることがありますが、管理者が含まれることもありますが、表示されることはありません。私のコードの何が問題になっていますか

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

クエリが必要以上に多くのIDを返している理由はわかりません。 get_usersの$argsは正しく見えます。

デフォルトではget_usersはorderby=Randをサポートしませんが、あなたはそのオプションを上書きすることができます。下記参照:

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' );
}

この方法では、すべてのユーザーを照会してから$ how_manyを除外するのではなく、$ how_manyユーザーのみを照会します。

私はこのフックを見つけました ここ

5
gdaniel