# 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.

- Type: PHP
- Runs: Run everywhere
- Category: [Users](https://wpide.com/library/category/users/)
- Tags: members, directory, shortcode
- Author: WPIDE Team
- Installs: 0
- Updated: 2026-10-28
- Page: https://wpide.com/library/member-directory-shortcode/

## Code

```php
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 use it

Install the free WPIDE plugin (https://wordpress.org/plugins/wpide/), find "Member Directory Shortcode" in its snippet library and add it in one click; or create a new PHP snippet in WPIDE (or any code snippets plugin) and paste the code above. More snippets: https://wpide.com/library/
