automattic / buddypress-hidden-profiles
Hide BuddyPress profiles from non-admins.
Package info
github.com/Automattic/buddypress-hidden-profiles
Type:wordpress-plugin
pkg:composer/automattic/buddypress-hidden-profiles
Requires
- php: >=8.2
- composer/installers: ^2
Requires (Dev)
Suggests
None
Provides
None
Conflicts
None
Replaces
None
This package is auto-updated.
Last update: 2026-10-13 11:25:01 UTC
README
Contributors: garyj
Tags: BuddyPress, BuddyBoss, profiles, privacy, admin
Requires at least: 6.6
Tested up to: 7.1
Stable tag: 1.2.0
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html
Allows site admins to mark BuddyPress user profiles as hidden, excluding them from directories, searches, and making their profile pages return a 404 for non-admins.
Description
This plugin provides a simple way to hide specific BuddyPress user profiles from non-administrative users. It's intended for accounts that other members don't need to find, such as platform service accounts and temporary support accounts. When a profile is marked as hidden:
- The profile page returns a 404 error for non-admins
- The user is excluded from member directories, widgets, and friends lists
- The user is excluded from search results
- The user is excluded from AJAX-loaded member lists
- The user is excluded from group member lists, except for that group's admins and moderators
- The user is excluded from group invite lists
- The user is excluded from @mention suggestions
- The user is excluded from the BuddyPress/BuddyBoss REST API members list, and requesting them, their avatar, their cover image or their profile field data by ID returns a 404
Hidden profiles remain visible to:
- The profile owner themselves
- Site administrators
- Users with the
manage_optionscapability
Known limitations
The plugin hides a member's profile and keeps them out of member listings. It doesn't make them invisible across the site, so it works best for accounts that don't take part in the community:
- Content the member creates, such as activity updates, forum posts, comments and messages, still shows their name and avatar, and links to their profile, which returns a 404.
- If the member is an admin or moderator of a group, they're still listed as one in that group's header. Avoid giving hidden members those roles.
Features
- Simple checkbox interface in the WordPress user profile screen
- Hides profiles and member listings from non-admins
- Efficient caching of hidden user IDs
- WP-CLI support for bulk operations
- Maintains visibility for admins and profile owners
- Extensible via filters for custom hiding logic
Installation
- Upload the
buddypress-hidden-profilesfolder to the/wp-content/plugins/directory - Activate the plugin through the 'Plugins' menu in WordPress
- Configure hidden profiles through the WordPress user profile screen or set the user meta value.
Usage
WordPress Admin Interface
- Go to Users → All Users
- Click on the user you want to hide
- Scroll down to the "Profile Visibility" section
- Check the "Hidden Profile" checkbox
- Click "Update User"
WP-CLI
You can also manage hidden profiles using WP-CLI:
# Hide a profile wp user meta update <user_id> profile_visibility hidden # Unhide a profile wp user meta delete <user_id> profile_visibility
Changing the profile_visibility meta clears the hidden users cache, so the change shows straight away.
Extending with Filters
The plugin provides two filters for extending its functionality:
1. buddypress_hidden_profiles_is_hidden
This filter allows you to decide whether a single user's profile is hidden. It's called for their profile page and for REST API requests for them by ID. It doesn't affect member lists, so to hide a user everywhere, use the buddypress_hidden_profiles_additional_hidden_ids filter instead. Return null to fall back to the list of hidden users.
Here's how it could be used:
add_filter( 'buddypress_hidden_profiles_is_hidden', function( $is_hidden, $user_id ) { // If another filter has already decided, respect that decision. if ( is_bool( $is_hidden ) ) { return $is_hidden; } // Example: Hide users with a specific meta value. $should_hide = get_user_meta( $user_id, 'my_custom_meta', true ); if ( ! empty( $should_hide ) ) { return true; } // Fall back to default check. return null; }, 10, 2 );
2. buddypress_hidden_profiles_additional_hidden_ids
This filter allows you to add user IDs to the list of hidden users. Users it returns are hidden everywhere: member lists, profile pages and the REST API. It should return an array of IDs determined by a performant query. The result is cached for up to a day, so clear the cache when the users it returns change.
Here's how it could be used:
add_filter( 'buddypress_hidden_profiles_additional_hidden_ids', function( $additional_hidden ) { global $wpdb; // Example: Get users with a specific meta value in a single query. $extra_hidden = $wpdb->get_col( $wpdb->prepare( "SELECT user_id FROM {$wpdb->usermeta} WHERE meta_key = %s", 'my_custom_meta' ) ); return array_merge( $additional_hidden, $extra_hidden ); } );
Cache Management
The plugin caches the list of hidden IDs for better performance. On multisite, the list is shared by every site in the network. It automatically clears its cache when:
- A user's
profile_visibilitymeta changes, whether from the profile screen, WP-CLI or code - A user is registered
- A user is deleted
- A user's role changes
You can also manually clear the cache using WP-CLI:
wp cache delete bp_hidden_user_ids buddypress_hidden_profiles
Requirements
- WordPress 6.6 or higher
- PHP 8.2 or higher
- BuddyPress or BuddyBoss Platform
Troubleshooting
If a hidden profile is still visible:
- Clear the WordPress object cache
- Verify the user has the correct meta value:
profile_visibility = hidden - Check that the viewing user is not an admin or the profile owner
- If you hide users with the
buddypress_hidden_profiles_additional_hidden_idsfilter, clear the cache after changing who it returns - Check if any filters are overriding the default behavior
Contributing
See CONTRIBUTING.md for how to set up a development environment and propose a change.
Changelog
See CHANGELOG.md for a complete list of changes.
License
This plugin is licensed under the GPLv2 or later. See LICENSE for details.