Title: WP_User::has_cap
Published: April 25, 2014
Last modified: February 24, 2026

---

# WP_User::has_cap( string $cap, mixed $args ): bool

## In this article

 * [Description](https://developer.wordpress.org/reference/classes/WP_User/has_cap/?output_format=md#description)
    - [See also](https://developer.wordpress.org/reference/classes/WP_User/has_cap/?output_format=md#see-also)
 * [Parameters](https://developer.wordpress.org/reference/classes/WP_User/has_cap/?output_format=md#parameters)
 * [Return](https://developer.wordpress.org/reference/classes/WP_User/has_cap/?output_format=md#return)
 * [Source](https://developer.wordpress.org/reference/classes/WP_User/has_cap/?output_format=md#source)
 * [Hooks](https://developer.wordpress.org/reference/classes/WP_User/has_cap/?output_format=md#hooks)
 * [Related](https://developer.wordpress.org/reference/classes/WP_User/has_cap/?output_format=md#related)
 * [Changelog](https://developer.wordpress.org/reference/classes/WP_User/has_cap/?output_format=md#changelog)

[ Back to top](https://developer.wordpress.org/reference/classes/WP_User/has_cap/?output_format=md#wp--skip-link--target)

Returns whether the user has the specified capability.

## 󠀁[Description](https://developer.wordpress.org/reference/classes/WP_User/has_cap/?output_format=md#description)󠁿

This function also accepts an ID of an object to check against if the capability
is a meta capability. Meta capabilities such as `edit_post` and `edit_user` are 
capabilities used by the `map_meta_cap()` function to map to primitive capabilities
that a user or role has, such as `edit_posts` and `edit_others_posts`.

Example usage:

    ```php
    $user->has_cap( 'edit_posts' );
    $user->has_cap( 'edit_post', $post->ID );
    $user->has_cap( 'edit_post_meta', $post->ID, $meta_key );
    ```

While checking against a role in place of a capability is supported in part, this
practice is discouraged as it may produce unreliable results.

### 󠀁[See also](https://developer.wordpress.org/reference/classes/WP_User/has_cap/?output_format=md#see-also)󠁿

 * [map_meta_cap()](https://developer.wordpress.org/reference/functions/map_meta_cap/)

## 󠀁[Parameters](https://developer.wordpress.org/reference/classes/WP_User/has_cap/?output_format=md#parameters)󠁿

 `$cap`stringrequired

Capability name.

`$args`mixedoptional

Optional further parameters, typically starting with an object ID.

## 󠀁[Return](https://developer.wordpress.org/reference/classes/WP_User/has_cap/?output_format=md#return)󠁿

 bool Whether the user has the given capability, or, if an object ID is passed, 
whether the user has the given capability for that object.

## 󠀁[Source](https://developer.wordpress.org/reference/classes/WP_User/has_cap/?output_format=md#source)󠁿

    ```php
    public function has_cap( $cap, ...$args ) {
    	if ( is_numeric( $cap ) ) {
    		_deprecated_argument( __FUNCTION__, '2.0.0', __( 'Usage of user levels is deprecated. Use capabilities instead.' ) );
    		$cap = $this->translate_level_to_cap( $cap );
    	}

    	$caps = map_meta_cap( $cap, $this->ID, ...$args );

    	// Multisite super admin has all caps by definition, Unless specifically denied.
    	if ( is_multisite() && is_super_admin( $this->ID ) ) {
    		if ( in_array( 'do_not_allow', $caps, true ) ) {
    			return false;
    		}
    		return true;
    	}

    	// Maintain BC for the argument passed to the "user_has_cap" filter.
    	$args = array_merge( array( $cap, $this->ID ), $args );

    	/**
    	 * Dynamically filter a user's capabilities.
    	 *
    	 * @since 2.0.0
    	 * @since 3.7.0 Added the `$user` parameter.
    	 *
    	 * @param bool[]   $allcaps Array of key/value pairs where keys represent a capability name
    	 *                          and boolean values represent whether the user has that capability.
    	 * @param string[] $caps    Required primitive capabilities for the requested capability.
    	 * @param array    $args {
    	 *     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.
    	 */
    	$capabilities = apply_filters( 'user_has_cap', $this->allcaps, $caps, $args, $this );

    	// Everyone is allowed to exist.
    	$capabilities['exist'] = true;

    	// Nobody is allowed to do things they are not allowed to do.
    	unset( $capabilities['do_not_allow'] );

    	// Must have ALL requested caps.
    	foreach ( (array) $caps as $cap ) {
    		if ( empty( $capabilities[ $cap ] ) ) {
    			return false;
    		}
    	}

    	return true;
    }
    ```

[View all references](https://developer.wordpress.org/reference/files/wp-includes/class-wp-user.php/)
[View on Trac](https://core.trac.wordpress.org/browser/tags/6.9.4/src/wp-includes/class-wp-user.php#L784)
[View on GitHub](https://github.com/WordPress/wordpress-develop/blob/6.9.4/src/wp-includes/class-wp-user.php#L784-L837)

## 󠀁[Hooks](https://developer.wordpress.org/reference/classes/WP_User/has_cap/?output_format=md#hooks)󠁿

 [apply_filters( ‘user_has_cap’, bool[] $allcaps, string[] $caps, array $args, WP_User $user )](https://developer.wordpress.org/reference/hooks/user_has_cap/)

Dynamically filter a user’s capabilities.

## 󠀁[Related](https://developer.wordpress.org/reference/classes/WP_User/has_cap/?output_format=md#related)󠁿

| Uses | Description | 
| [WP_User::translate_level_to_cap()](https://developer.wordpress.org/reference/classes/wp_user/translate_level_to_cap/)`wp-includes/class-wp-user.php` |

Converts numeric level to level capability name.

  | 
| [is_super_admin()](https://developer.wordpress.org/reference/functions/is_super_admin/)`wp-includes/capabilities.php` |

Determines whether user is a site admin.

  | 
| [map_meta_cap()](https://developer.wordpress.org/reference/functions/map_meta_cap/)`wp-includes/capabilities.php` |

Maps a capability to the primitive capabilities required of the given user to satisfy the capability being checked.

  | 
| [__()](https://developer.wordpress.org/reference/functions/__/)`wp-includes/l10n.php` |

Retrieves the translation of $text.

  | 
| [is_multisite()](https://developer.wordpress.org/reference/functions/is_multisite/)`wp-includes/load.php` |

Determines whether Multisite is enabled.

  | 
| [_deprecated_argument()](https://developer.wordpress.org/reference/functions/_deprecated_argument/)`wp-includes/functions.php` |

Marks a function argument as deprecated and inform when it has been used.

  | 
| [apply_filters()](https://developer.wordpress.org/reference/functions/apply_filters/)`wp-includes/plugin.php` |

Calls the callback functions that have been added to a filter hook.

  |

[Show 4 more](https://developer.wordpress.org/reference/classes/WP_User/has_cap/?output_format=md#)
[Show less](https://developer.wordpress.org/reference/classes/WP_User/has_cap/?output_format=md#)

## 󠀁[Changelog](https://developer.wordpress.org/reference/classes/WP_User/has_cap/?output_format=md#changelog)󠁿

| Version | Description | 
| [5.3.0](https://developer.wordpress.org/reference/since/5.3.0/) | Formalized the existing and already documented `...$args` parameter by adding it to the function signature. | 
| [2.0.0](https://developer.wordpress.org/reference/since/2.0.0/) | Introduced. |

## User Contributed Notes

You must [log in](https://login.wordpress.org/?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Fclasses%2Fwp_user%2Fhas_cap%2F)
before being able to contribute a note or feedback.