: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
$wp_roles = new WP_Roles();
* @param string $role Role name.
* @return WP_Role|null WP_Role object if found, null if the role does not exist.
function get_role( $role ) {
return wp_roles()->get_role( $role );
* Adds a role, if it does not exist.
* @param string $role Role name.
* @param string $display_name Display name for role.
* @param bool[] $capabilities List of capabilities keyed by the capability name,
* e.g. array( 'edit_posts' => true, 'delete_posts' => false ).
* @return WP_Role|void WP_Role object, if the role is added.
function add_role( $role, $display_name, $capabilities = array() ) {
return wp_roles()->add_role( $role, $display_name, $capabilities );
* Removes a role, if it exists.
* @param string $role Role name.
function remove_role( $role ) {
wp_roles()->remove_role( $role );
* Retrieves a list of super admins.
* @global array $super_admins
* @return string[] List of super admin logins.
function get_super_admins() {
if ( isset( $super_admins ) ) {
return get_site_option( 'site_admins', array( 'admin' ) );
* Determines whether user is a site admin.
* @param int|false $user_id Optional. The ID of a user. Defaults to false, to check the current user.
* @return bool Whether the user is a site admin.
function is_super_admin( $user_id = false ) {
$user = wp_get_current_user();
$user = get_userdata( $user_id );
if ( ! $user || ! $user->exists() ) {
$super_admins = get_super_admins();
if ( is_array( $super_admins ) && in_array( $user->user_login, $super_admins, true ) ) {
} elseif ( $user->has_cap( 'delete_users' ) ) {
* Grants Super Admin privileges.
* @global array $super_admins
* @param int $user_id ID of the user to be granted Super Admin privileges.
* @return bool True on success, false on failure. This can fail when the user is
* already a super admin or when the `$super_admins` global is defined.
function grant_super_admin( $user_id ) {
// If global super_admins override is defined, there is nothing to do here.
if ( isset( $GLOBALS['super_admins'] ) || ! is_multisite() ) {
* Fires before the user is granted Super Admin privileges.
* @param int $user_id ID of the user that is about to be granted Super Admin privileges.
do_action( 'grant_super_admin', $user_id );
// Directly fetch site_admins instead of using get_super_admins().
$super_admins = get_site_option( 'site_admins', array( 'admin' ) );
$user = get_userdata( $user_id );
if ( $user && ! in_array( $user->user_login, $super_admins, true ) ) {
$super_admins[] = $user->user_login;
update_site_option( 'site_admins', $super_admins );
* Fires after the user is granted Super Admin privileges.
* @param int $user_id ID of the user that was granted Super Admin privileges.
do_action( 'granted_super_admin', $user_id );
* Revokes Super Admin privileges.
* @global array $super_admins
* @param int $user_id ID of the user Super Admin privileges to be revoked from.
* @return bool True on success, false on failure. This can fail when the user's email
* is the network admin email or when the `$super_admins` global is defined.
function revoke_super_admin( $user_id ) {
// If global super_admins override is defined, there is nothing to do here.
if ( isset( $GLOBALS['super_admins'] ) || ! is_multisite() ) {
* Fires before the user's Super Admin privileges are revoked.
* @param int $user_id ID of the user Super Admin privileges are being revoked from.
do_action( 'revoke_super_admin', $user_id );
// Directly fetch site_admins instead of using get_super_admins().
$super_admins = get_site_option( 'site_admins', array( 'admin' ) );
$user = get_userdata( $user_id );
if ( $user && 0 !== strcasecmp( $user->user_email, get_site_option( 'admin_email' ) ) ) {
$key = array_search( $user->user_login, $super_admins, true );
unset( $super_admins[ $key ] );
update_site_option( 'site_admins', $super_admins );
* Fires after the user's Super Admin privileges are revoked.
* @param int $user_id ID of the user Super Admin privileges were revoked from.
do_action( 'revoked_super_admin', $user_id );
* Filters the user capabilities to grant the 'install_languages' capability as necessary.
* A user must have at least one out of the 'update_core', 'install_plugins', and
* 'install_themes' capabilities to qualify for 'install_languages'.
* @param bool[] $allcaps An array of all the user's capabilities.
* @return bool[] Filtered array of the user's capabilities.
function wp_maybe_grant_install_languages_cap( $allcaps ) {
if ( ! empty( $allcaps['update_core'] ) || ! empty( $allcaps['install_plugins'] ) || ! empty( $allcaps['install_themes'] ) ) {
$allcaps['install_languages'] = true;
* Filters the user capabilities to grant the 'resume_plugins' and 'resume_themes' capabilities as necessary.
* @param bool[] $allcaps An array of all the user's capabilities.
* @return bool[] Filtered array of the user's capabilities.
function wp_maybe_grant_resume_extensions_caps( $allcaps ) {
// Even in a multisite, regular administrators should be able to resume plugins.
if ( ! empty( $allcaps['activate_plugins'] ) ) {
$allcaps['resume_plugins'] = true;
// Even in a multisite, regular administrators should be able to resume themes.
if ( ! empty( $allcaps['switch_themes'] ) ) {
$allcaps['resume_themes'] = true;
* Filters the user capabilities to grant the 'view_site_health_checks' capabilities as necessary.
* @param bool[] $allcaps An array of all the user's capabilities.
* @param string[] $caps Required primitive capabilities for the requested capability.
* Arguments that accompany the requested capability check.
* @type string $0 Requested capability.
* @type int $1 Concerned user ID.
* @type mixed ...$2 Optional second and further parameters, typically object ID.
* @param WP_User $user The user object.
* @return bool[] Filtered array of the user's capabilities.
function wp_maybe_grant_site_health_caps( $allcaps, $caps, $args, $user ) {
if ( ! empty( $allcaps['install_plugins'] ) && ( ! is_multisite() || is_super_admin( $user->ID ) ) ) {
$allcaps['view_site_health_checks'] = true;
// Dummy gettext calls to get strings in the catalog.
/* translators: User role for administrators. */
_x( 'Administrator', 'User role' );
/* translators: User role for editors. */
_x( 'Editor', 'User role' );
/* translators: User role for authors. */
_x( 'Author', 'User role' );
/* translators: User role for contributors. */
_x( 'Contributor', 'User role' );
/* translators: User role for subscribers. */
_x( 'Subscriber', 'User role' );