User Post Type
Create filterable user listings
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)