This plugin lets you connect users to a post type, so that you can create user listings and filter users like any other post type 🙂

How it works

The plugin adds a new hidden upt_user post type, and adds a post for each user.

Setup

Browse to Settings > User Post Type and click the “Sync now” button.

As seen above, you can also copy extra data into the postmeta table. This is not required to display fields — it’s only useful for meta_query.

Here’s a list of dropdown choices and corresponding meta_query keys:

Option Meta Key
User ID ID
User Login user_login
User Email user_email
User URL user_url
Registration Date user_registered
User Status user_status
Display Name display_name
Roles roles
Usermeta field meta-zipcode (keys are prefixed with meta-)
BuddyPress field bp-123 (field IDs are prefixed with bp-)

Displaying users

To display a list of users, use WP_Query (not WP_User_Query) like so:

$args  = [
  'post_type'      => 'upt_user',
  'post_status'    => 'publish',
  'posts_per_page' => 10,
];
$query = new WP_Query( $args );

Displaying a subset of users

To display only administrators, select “Roles” in the settings page dropdown, then Sync. Afterwards, use the field within meta_query:

$args  = [
  'post_type'      => 'upt_user',
  'post_status'    => 'publish',
  'orderby'        => [
    'title' => 'ASC'
  ],
  'posts_per_page' => 30,
  'meta_query'     => [
    [
      'key'     => 'roles',
      'value'   => 'administrator',
      'compare' => '=',
    ]
  ]
];
$query = new WP_Query( $args );

The same with multiple roles, in this example administrators and editors:

$args  = [
  'post_type'      => 'upt_user',
  'post_status'    => 'publish',
  'orderby'        => [
    'title' => 'ASC'
  ],
  'posts_per_page' => 30,
  'meta_query'     => [
    [
      'key'     => 'roles',
      'value'   => [ 'administrator', 'editor' ],
      'compare' => 'IN',
    ]
  ]  
];
$query = new WP_Query( $args ); 

Displaying user fields

UPT supports WP’s get_user_meta() function. Just replace $user_id with UPT()->get_user_id():

echo get_user_meta( UPT()->get_user_id(), 'your_field_name', true );

Outside of The Loop, pass in the post ID like so:

echo get_user_meta( UPT()->get_user_id( THE_POST_ID ), 'your_field_name', true );

To get a user’s photo, you can use WP’s get_avatar() function, assuming that the image is stored in WP’s default “Profile Picture” field:

echo get_avatar( UPT()->get_user_id( THE_POST_ID ), 150 );

Adding facets

When adding a new facet via Settings > FacetWP, you’ll see a new “User Fields” section in the Data source dropdown.

Finding a user’s associated post

Use the following if you have a $user_id and want to find the $post_id of the associated post:

$post_id = (int) get_user_meta( $user_id, UPT()->meta_key, true );

Prevent a specific user from being synced

add_filter( 'upt_sync_skip_user', function( $bool, $user_id ) {
    if ( 1 === $user_id ) {
        return true;
    }
    return $bool;
}, 10, 2 );

Prevent users with a specific role from being synced

add_filter( 'upt_sync_skip_user', function( $bool, $user_id ) {
    $roles = (array) get_user_by( 'ID', $user_id )->roles;
    $roles_to_skip = [ 'wholesaler' ];

    foreach ( $roles_to_skip as $role ) {
        if ( in_array( $role, $roles ) ) {
            return true; // do not sync this user
        }
    }

    return $bool;
}, 10, 2 );

Force the admin menu to appear

add_filter( 'upt_post_type_args', function( $args ) {
    $args['show_in_menu'] = true;
    return $args;
});

Perform some post-sync actions

add_action( 'upt_sync_post', function( $post_id, $user_id ) {
​    // do something after a user is synced
​}, 10, 2 );

Force only certain users to be indexed

add_filter( 'upt_sync_where', function( $where ) {
    $where = ' AND u.ID IN (1, 2, 3, 4, 5)';
    return $where;
});

Changelog

0.7.7

  • Fixed issue preventing value of "0" from getting indexed (props Jenny)

0.7.6

  • Important Go into `Settings > User Post Type` and hit the "Sync" button
  • Fixed issue causing a new meta row to get added on each user save

0.7.5

  • Fixed sync issues (prevents needing to manually re-sync in many cases), props Jenny

0.7.4

  • New added `upt_sync_where` hook to customize the SQL WHERE clause

0.7.3

  • New added multisite support (only sync users of the current site)

See also