Member Directory Shortcode
Adds a [wpide_members] shortcode that lists members with their avatar and display name in a responsive, paginated grid, shown only to logged-in visitors by default.
Opens WPIDE on
Code
add_shortcode( 'wpide_members', function ( $atts ) {
$atts = shortcode_atts( array( 'role' => '', 'per_page' => 24, 'public' => 'no' ), $atts, 'wpide_members' );
if ( 'yes' !== $atts['public'] && ! is_user_logged_in() ) {
return '<p>Please <a href="' . esc_url( wp_login_url( get_permalink() ) ) . '">log in</a> to see the member directory.</p>';
}
$per_page = max( 1, min( 100, (int) $atts['per_page'] ) );
$page = isset( $_GET['members-page'] ) ? max( 1, absint( $_GET['members-page'] ) ) : 1;
$args = array(
'number' => $per_page,
'paged' => $page,
'orderby' => 'display_name',
'order' => 'ASC',
'fields' => array( 'ID', 'display_name' ),
);
if ( $atts['role'] ) {
$args['role__in'] = array_map( 'sanitize_key', explode( ',', $atts['role'] ) );
}
$query = new WP_User_Query( $args );
$users = $query->get_results();
if ( ! $users ) {
return '<p>No members found.</p>';
}
$html = '<ul class="wpide-members" style="list-style:none;padding:0;display:grid;gap:1.25em;grid-template-columns:repeat(auto-fill,minmax(140px,1fr))">';
foreach ( $users as $user ) {
$html .= '<li style="text-align:center">' . get_avatar( $user->ID, 96, '', '', array( 'loading' => 'lazy' ) ) . '<br>' . esc_html( $user->display_name ) . '</li>';
}
$html .= '</ul>';
$pages = (int) ceil( $query->get_total() / $per_page );
if ( $pages > 1 ) {
$html .= '<nav class="wpide-members-pages" aria-label="Member directory pages">' . paginate_links( array(
'base' => add_query_arg( 'members-page', '%#%' ),
'format' => '',
'current' => $page,
'total' => $pages,
) ) . '</nav>';
}
return $html;
} );
Notes
Attributes: role="subscriber" per_page="24" public="yes" (show it to visitors too). Only display names and avatars are shown, never emails.
How to add this snippet
- Install WPIDE on your WordPress site (it is free) and open Code Snippets.
- Use snippet above adds it from the library in one click. Or copy the code into a new snippet with the same code type.
- It is added inactive: review the code and settings, then switch it on.