私は少し 機能 をショートコードで彼らのアバターでランダムなユーザーの数を表示するために適応させました。それは動作しますが、何かが良くありません。ときどき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 />';
}
}
クエリが必要以上に多くの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ユーザーのみを照会します。
私はこのフックを見つけました ここ 。