wp_authenticate_application_password( WP_User|WP_Error|null $input_user, string $username, string $password ): WP_User|WP_Error|null
- Since
- 5.6.0
- Source
wp-includes/user.php:372
Parameters
$input_userWP_User|WP_Error|null- WP_User or WP_Error object if a previous callback failed authentication.
$usernamestring- Username for authentication.
$passwordstring- Password for authentication.
Return
WP_User|WP_Error|null- WP_User on success, WP_Error on failure, null if null is passed in and this isn't an API request.
Cost profile
Measured from the compiled opcodes, not from a stopwatch. Every number here is identical on any machine that runs the same PHP version, and every function in core is ranked by these figures.
- Cost class
- Heavy
- Scaling
- Scales with input
- Instructions
- 6–103
- Plugin surface
- 4 hooks
- Called by
- 1
Reaches the database via get_user_by().
The body loops, so the work grows with what you pass in.
Executed per call on PHP 8.4, depending on the branch taken. The body compiles to 162.
Third-party callbacks on 'application_password_is_api_request', 'application_password_failed_authentication', 'wp_authenticate_application_password_errors' run inside this call, and their cost is not bounded by anything here.
1 place in core call this, so the cost is paid more often than your own code shows.
What it touches
- hookthird-party callbacks
apply_filters()called directly - querycontent query
get_user_by()called directly
Further down the call graph this can also reach option, cache, serialize and transient — those are the worst case, several calls deep and usually down an error path, not what a normal call pays.
What one call costs · 47 distinct outcomes
One number would be a lie: the work depends on which branch runs. These are every distinct cost wp_authenticate_application_password() can have, taken from its control-flow graph on PHP 8.4.
| When | Instructions | Calls it makes |
|---|---|---|
$input_user instanceof | 6 | none |
!($input_user instanceof) && !::WP_Application_Passwords() | 9 | ::WP_Application_Passwords() |
!($input_user instanceof) && ::WP_Application_Passwords() | 20–24 | ::WP_Application_Passwords()apply_filters() |
!($input_user instanceof) && ::WP_Application_Passwords() && wp_is_application_passwords_available() && wp_is_application_passwords_available_for_user() | 39–43 | ::WP_Application_Passwords()apply_filters()get_user_by()wp_is_application_passwords_available()wp_is_application_passwords_available_for_user()do_action() |
!($input_user instanceof) && ::WP_Application_Passwords() && !wp_is_application_passwords_available() | 44–48 | ::WP_Application_Passwords()apply_filters()get_user_by()wp_is_application_passwords_available()__()do_action() |
!($input_user instanceof) && ::WP_Application_Passwords() && !is_email() && wp_is_application_passwords_available() && wp_is_application_passwords_available_for_user() | 44–48 | ::WP_Application_Passwords()apply_filters()get_user_by()is_email()wp_is_application_passwords_available()wp_is_application_passwords_available_for_user()do_action() |
!($input_user instanceof) && ::WP_Application_Passwords() && wp_is_application_passwords_available() && !wp_is_application_passwords_available_for_user() | 47–51 | ::WP_Application_Passwords()apply_filters()get_user_by()wp_is_application_passwords_available()wp_is_application_passwords_available_for_user()__()do_action() |
!($input_user instanceof) && ::WP_Application_Passwords() && !is_email() && !wp_is_application_passwords_available() | 49–53 | ::WP_Application_Passwords()apply_filters()get_user_by()is_email()wp_is_application_passwords_available()__()do_action() |
!($input_user instanceof) && ::WP_Application_Passwords() && is_email() && wp_is_application_passwords_available() && wp_is_application_passwords_available_for_user() | 49–53 | ::WP_Application_Passwords()apply_filters()get_user_by()is_email()get_user_by()wp_is_application_passwords_available()wp_is_application_passwords_available_for_user()do_action() |
!($input_user instanceof) && ::WP_Application_Passwords() && !is_email() | 50–54 | ::WP_Application_Passwords()apply_filters()get_user_by()is_email()is_email()__()do_action() |
!($input_user instanceof) && ::WP_Application_Passwords() && !is_email() && wp_is_application_passwords_available() && !wp_is_application_passwords_available_for_user() | 52–56 | ::WP_Application_Passwords()apply_filters()get_user_by()is_email()wp_is_application_passwords_available()wp_is_application_passwords_available_for_user()__()do_action() |
!($input_user instanceof) && ::WP_Application_Passwords() && is_email() && !wp_is_application_passwords_available() | 54–58 | ::WP_Application_Passwords()apply_filters()get_user_by()is_email()get_user_by()wp_is_application_passwords_available()__()do_action() |
35 further outcomes, up to 103 instructions
!($input_user instanceof) && ::WP_Application_Passwords() && is_email() | 55–59 | ::WP_Application_Passwords()apply_filters()get_user_by()is_email()get_user_by()is_email()__()do_action() |
!($input_user instanceof) && ::WP_Application_Passwords() && is_email() && wp_is_application_passwords_available() && !wp_is_application_passwords_available_for_user() | 57–61 | ::WP_Application_Passwords()apply_filters()get_user_by()is_email()get_user_by()wp_is_application_passwords_available()wp_is_application_passwords_available_for_user()__()do_action() |
!($input_user instanceof) && ::WP_Application_Passwords() && wp_is_application_passwords_available() && wp_is_application_passwords_available_for_user() | 58–63 | ::WP_Application_Passwords()apply_filters()get_user_by()wp_is_application_passwords_available()wp_is_application_passwords_available_for_user()::WP_Application_Passwords()__()do_action() |
!($input_user instanceof) && ::WP_Application_Passwords() && !wp_is_application_passwords_available() | 63–68 | ::WP_Application_Passwords()apply_filters()get_user_by()wp_is_application_passwords_available()__()::WP_Application_Passwords()__()do_action() |
!($input_user instanceof) && ::WP_Application_Passwords() && !is_email() && wp_is_application_passwords_available() && wp_is_application_passwords_available_for_user() | 63–68 | ::WP_Application_Passwords()apply_filters()get_user_by()is_email()wp_is_application_passwords_available()wp_is_application_passwords_available_for_user()::WP_Application_Passwords()__()do_action() |
!($input_user instanceof) && ::WP_Application_Passwords() && wp_is_application_passwords_available() && !wp_is_application_passwords_available_for_user() | 66–71 | ::WP_Application_Passwords()apply_filters()get_user_by()wp_is_application_passwords_available()wp_is_application_passwords_available_for_user()__()::WP_Application_Passwords()__()do_action() |
!($input_user instanceof) && ::WP_Application_Passwords() && !is_email() && !wp_is_application_passwords_available() | 68–73 | ::WP_Application_Passwords()apply_filters()get_user_by()is_email()wp_is_application_passwords_available()__()::WP_Application_Passwords()__()do_action() |
!($input_user instanceof) && ::WP_Application_Passwords() && is_email() && wp_is_application_passwords_available() && wp_is_application_passwords_available_for_user() | 68–73 | ::WP_Application_Passwords()apply_filters()get_user_by()is_email()get_user_by()wp_is_application_passwords_available()wp_is_application_passwords_available_for_user()::WP_Application_Passwords()__()do_action() |
!($input_user instanceof) && ::WP_Application_Passwords() && !is_email() | 69–74 | ::WP_Application_Passwords()apply_filters()get_user_by()is_email()is_email()__()::WP_Application_Passwords()__()do_action() |
!($input_user instanceof) && ::WP_Application_Passwords() && !is_email() && wp_is_application_passwords_available() && !wp_is_application_passwords_available_for_user() | 71–76 | ::WP_Application_Passwords()apply_filters()get_user_by()is_email()wp_is_application_passwords_available()wp_is_application_passwords_available_for_user()__()::WP_Application_Passwords()__()do_action() |
!($input_user instanceof) && ::WP_Application_Passwords() && wp_is_application_passwords_available() && wp_is_application_passwords_available_for_user() && !$hashed_passwords && ->has_errors() | 72–76 | ::WP_Application_Passwords()apply_filters()get_user_by()wp_is_application_passwords_available()wp_is_application_passwords_available_for_user()::WP_Application_Passwords()::WP_Application_Passwords()do_action()->has_errors()do_action() |
!($input_user instanceof) && ::WP_Application_Passwords() && is_email() && !wp_is_application_passwords_available() | 73–78 | ::WP_Application_Passwords()apply_filters()get_user_by()is_email()get_user_by()wp_is_application_passwords_available()__()::WP_Application_Passwords()__()do_action() |
!($input_user instanceof) && ::WP_Application_Passwords() && is_email() | 74–79 | ::WP_Application_Passwords()apply_filters()get_user_by()is_email()get_user_by()is_email()__()::WP_Application_Passwords()__()do_action() |
!($input_user instanceof) && ::WP_Application_Passwords() && is_email() && wp_is_application_passwords_available() && !wp_is_application_passwords_available_for_user() | 76–81 | ::WP_Application_Passwords()apply_filters()get_user_by()is_email()get_user_by()wp_is_application_passwords_available()wp_is_application_passwords_available_for_user()__()::WP_Application_Passwords()__()do_action() |
!($input_user instanceof) && ::WP_Application_Passwords() && !wp_is_application_passwords_available() && !$hashed_passwords && ->has_errors() | 77–81 | ::WP_Application_Passwords()apply_filters()get_user_by()wp_is_application_passwords_available()__()::WP_Application_Passwords()::WP_Application_Passwords()do_action()->has_errors()do_action() |
!($input_user instanceof) && ::WP_Application_Passwords() && !is_email() && wp_is_application_passwords_available() && wp_is_application_passwords_available_for_user() && !$hashed_passwords && ->has_errors() | 77–81 | ::WP_Application_Passwords()apply_filters()get_user_by()is_email()wp_is_application_passwords_available()wp_is_application_passwords_available_for_user()::WP_Application_Passwords()::WP_Application_Passwords()do_action()->has_errors()do_action() |
!($input_user instanceof) && ::WP_Application_Passwords() && wp_is_application_passwords_available() && !wp_is_application_passwords_available_for_user() && !$hashed_passwords && ->has_errors() | 80–84 | ::WP_Application_Passwords()apply_filters()get_user_by()wp_is_application_passwords_available()wp_is_application_passwords_available_for_user()__()::WP_Application_Passwords()::WP_Application_Passwords()do_action()->has_errors()do_action() |
!($input_user instanceof) && ::WP_Application_Passwords() && wp_is_application_passwords_available() && wp_is_application_passwords_available_for_user() && !$hashed_passwords && !->has_errors() | 81–85 | ::WP_Application_Passwords()apply_filters()get_user_by()wp_is_application_passwords_available()wp_is_application_passwords_available_for_user()::WP_Application_Passwords()::WP_Application_Passwords()do_action()->has_errors()::WP_Application_Passwords()do_action() |
!($input_user instanceof) && ::WP_Application_Passwords() && !is_email() && !wp_is_application_passwords_available() && !$hashed_passwords && ->has_errors() | 82–86 | ::WP_Application_Passwords()apply_filters()get_user_by()is_email()wp_is_application_passwords_available()__()::WP_Application_Passwords()::WP_Application_Passwords()do_action()->has_errors()do_action() |
!($input_user instanceof) && ::WP_Application_Passwords() && is_email() && wp_is_application_passwords_available() && wp_is_application_passwords_available_for_user() && !$hashed_passwords && ->has_errors() | 82–86 | ::WP_Application_Passwords()apply_filters()get_user_by()is_email()get_user_by()wp_is_application_passwords_available()wp_is_application_passwords_available_for_user()::WP_Application_Passwords()::WP_Application_Passwords()do_action()->has_errors()do_action() |
!($input_user instanceof) && ::WP_Application_Passwords() && !is_email() && !$hashed_passwords && ->has_errors() | 83–87 | ::WP_Application_Passwords()apply_filters()get_user_by()is_email()is_email()__()::WP_Application_Passwords()::WP_Application_Passwords()do_action()->has_errors()do_action() |
!($input_user instanceof) && ::WP_Application_Passwords() && !is_email() && wp_is_application_passwords_available() && !wp_is_application_passwords_available_for_user() && !$hashed_passwords && ->has_errors() | 85–89 | ::WP_Application_Passwords()apply_filters()get_user_by()is_email()wp_is_application_passwords_available()wp_is_application_passwords_available_for_user()__()::WP_Application_Passwords()::WP_Application_Passwords()do_action()->has_errors()do_action() |
!($input_user instanceof) && ::WP_Application_Passwords() && !wp_is_application_passwords_available() && !$hashed_passwords && !->has_errors() | 86–90 | ::WP_Application_Passwords()apply_filters()get_user_by()wp_is_application_passwords_available()__()::WP_Application_Passwords()::WP_Application_Passwords()do_action()->has_errors()::WP_Application_Passwords()do_action() |
!($input_user instanceof) && ::WP_Application_Passwords() && !is_email() && wp_is_application_passwords_available() && wp_is_application_passwords_available_for_user() && !$hashed_passwords && !->has_errors() | 86–90 | ::WP_Application_Passwords()apply_filters()get_user_by()is_email()wp_is_application_passwords_available()wp_is_application_passwords_available_for_user()::WP_Application_Passwords()::WP_Application_Passwords()do_action()->has_errors()::WP_Application_Passwords()do_action() |
!($input_user instanceof) && ::WP_Application_Passwords() && is_email() && !wp_is_application_passwords_available() && !$hashed_passwords && ->has_errors() | 87–91 | ::WP_Application_Passwords()apply_filters()get_user_by()is_email()get_user_by()wp_is_application_passwords_available()__()::WP_Application_Passwords()::WP_Application_Passwords()do_action()->has_errors()do_action() |
!($input_user instanceof) && ::WP_Application_Passwords() && is_email() && !$hashed_passwords && ->has_errors() | 88–92 | ::WP_Application_Passwords()apply_filters()get_user_by()is_email()get_user_by()is_email()__()::WP_Application_Passwords()::WP_Application_Passwords()do_action()->has_errors()do_action() |
!($input_user instanceof) && ::WP_Application_Passwords() && wp_is_application_passwords_available() && !wp_is_application_passwords_available_for_user() && !$hashed_passwords && !->has_errors() | 89–93 | ::WP_Application_Passwords()apply_filters()get_user_by()wp_is_application_passwords_available()wp_is_application_passwords_available_for_user()__()::WP_Application_Passwords()::WP_Application_Passwords()do_action()->has_errors()::WP_Application_Passwords()do_action() |
!($input_user instanceof) && ::WP_Application_Passwords() && is_email() && wp_is_application_passwords_available() && !wp_is_application_passwords_available_for_user() && !$hashed_passwords && ->has_errors() | 90–94 | ::WP_Application_Passwords()apply_filters()get_user_by()is_email()get_user_by()wp_is_application_passwords_available()wp_is_application_passwords_available_for_user()__()::WP_Application_Passwords()::WP_Application_Passwords()do_action()->has_errors()do_action() |
!($input_user instanceof) && ::WP_Application_Passwords() && !is_email() && !wp_is_application_passwords_available() && !$hashed_passwords && !->has_errors() | 91–95 | ::WP_Application_Passwords()apply_filters()get_user_by()is_email()wp_is_application_passwords_available()__()::WP_Application_Passwords()::WP_Application_Passwords()do_action()->has_errors()::WP_Application_Passwords()do_action() |
!($input_user instanceof) && ::WP_Application_Passwords() && is_email() && wp_is_application_passwords_available() && wp_is_application_passwords_available_for_user() && !$hashed_passwords && !->has_errors() | 91–95 | ::WP_Application_Passwords()apply_filters()get_user_by()is_email()get_user_by()wp_is_application_passwords_available()wp_is_application_passwords_available_for_user()::WP_Application_Passwords()::WP_Application_Passwords()do_action()->has_errors()::WP_Application_Passwords()do_action() |
!($input_user instanceof) && ::WP_Application_Passwords() && !is_email() && !$hashed_passwords && !->has_errors() | 92–96 | ::WP_Application_Passwords()apply_filters()get_user_by()is_email()is_email()__()::WP_Application_Passwords()::WP_Application_Passwords()do_action()->has_errors()::WP_Application_Passwords()do_action() |
!($input_user instanceof) && ::WP_Application_Passwords() && !is_email() && wp_is_application_passwords_available() && !wp_is_application_passwords_available_for_user() && !$hashed_passwords && !->has_errors() | 94–98 | ::WP_Application_Passwords()apply_filters()get_user_by()is_email()wp_is_application_passwords_available()wp_is_application_passwords_available_for_user()__()::WP_Application_Passwords()::WP_Application_Passwords()do_action()->has_errors()::WP_Application_Passwords()do_action() |
!($input_user instanceof) && ::WP_Application_Passwords() && is_email() && !wp_is_application_passwords_available() && !$hashed_passwords && !->has_errors() | 96–100 | ::WP_Application_Passwords()apply_filters()get_user_by()is_email()get_user_by()wp_is_application_passwords_available()__()::WP_Application_Passwords()::WP_Application_Passwords()do_action()->has_errors()::WP_Application_Passwords()do_action() |
!($input_user instanceof) && ::WP_Application_Passwords() && is_email() && !$hashed_passwords && !->has_errors() | 97–101 | ::WP_Application_Passwords()apply_filters()get_user_by()is_email()get_user_by()is_email()__()::WP_Application_Passwords()::WP_Application_Passwords()do_action()->has_errors()::WP_Application_Passwords()do_action() |
!($input_user instanceof) && ::WP_Application_Passwords() && is_email() && wp_is_application_passwords_available() && !wp_is_application_passwords_available_for_user() && !$hashed_passwords && !->has_errors() | 99–103 | ::WP_Application_Passwords()apply_filters()get_user_by()is_email()get_user_by()wp_is_application_passwords_available()wp_is_application_passwords_available_for_user()__()::WP_Application_Passwords()::WP_Application_Passwords()do_action()->has_errors()::WP_Application_Passwords()do_action() |
Across PHP versions
| PHP | Compiled | Executed | Branches | Notes |
|---|---|---|---|---|
7.4 | 165 | 6–106 | 17 | More instructions than PHP 8.4 |
8.1 | 165 | 6–106 | 17 | More instructions than PHP 8.4 |
8.2 | 165 | 6–106 | 17 | More instructions than PHP 8.4 |
8.3 | 165 | 6–106 | 17 | More instructions than PHP 8.4 |
8.4 | 162 | 6–103 | 17 | Compiles to the same instructions |
Oldest PHP that compiles this body: 7.4. An instruction is not a fixed amount of time, so a version with the same count is not necessarily the same speed; what the count rules out is a difference in the work itself.
Hooks fired · 6
6 hooks fire while wp_authenticate_application_password() runs, in this order:
- apply_filters( application_password_is_api_request )filterline 398 (+26 into the body)
Filters whether this is an API request that Application Passwords can be used on.
- do_action( application_password_failed_authentication )actionline 444 (+72 into the body)
Fires when an application password failed to authenticate the user.
- do_action( wp_authenticate_application_password_errors )actionline 478 (+106 into the body)
Fires when an application password has been successfully checked as valid.
- do_action( application_password_failed_authentication )actionline 482 (+110 into the body)
Fires when an application password failed to authenticate the user.
- do_action( application_password_did_authenticate )actionline 497 (+125 into the body)
Fires after an application password was used for authentication.
- do_action( application_password_failed_authentication )actionline 508 (+136 into the body)
Fires when an application password failed to authenticate the user.
Uses · 12
- apply_filters()Calls the callback functions that have been added to a filter hook.
- get_user_by()Retrieves user info by a given field.
- is_email()Verifies that an email is valid.
- __()Retrieves the translation of $text.
- wp_is_application_passwords_available()Checks if Application Passwords is globally available.
- wp_is_application_passwords_available_for_user()Checks if Application Passwords is available for a specific user.
- do_action()Calls the callback functions that have been added to an action hook.
- WP_Application_Passwords::is_in_use()Checks if application passwords are being used by the site.
- WP_Error::__construct()Initializes the error.
- WP_Application_Passwords::get_user_application_passwords()Gets a user's application passwords.
- WP_Application_Passwords::check_password()Checks a plaintext application password against a hashed password.
- WP_Application_Passwords::record_application_password_usage()Records that an application password has been used.
Used by · 1
- wp_validate_application_password()Validates the application password credentials passed via Basic Authentication.
Source
function wp_authenticate_application_password( $input_user, $username, #[\SensitiveParameter] $password) { if ( $input_user instanceof WP_User ) { return $input_user; } if ( ! WP_Application_Passwords::is_in_use() ) { return $input_user; } // The 'REST_REQUEST' check here may happen too early for the constant to be available. $is_api_request = ( ( defined( 'XMLRPC_REQUEST' ) && XMLRPC_REQUEST ) || ( defined( 'REST_REQUEST' ) && REST_REQUEST ) ); /** * Filters whether this is an API request that Application Passwords can be used on. * * By default, Application Passwords is available for the REST API and XML-RPC. * * @since 5.6.0 * * @param bool $is_api_request If this is an acceptable API request. */ $is_api_request = apply_filters( 'application_password_is_api_request', $is_api_request ); if ( ! $is_api_request ) { return $input_user; } $error = null; $user = get_user_by( 'login', $username ); if ( ! $user && is_email( $username ) ) { $user = get_user_by( 'email', $username ); } // If the login name is invalid, short circuit. if ( ! $user ) { if ( is_email( $username ) ) { $error = new WP_Error( 'invalid_email', __( '<strong>Error:</strong> Unknown email address. Check again or try your username.' ) ); } else { $error = new WP_Error( 'invalid_username', __( '<strong>Error:</strong> Unknown username. Check again or try your email address.' ) ); } } elseif ( ! wp_is_application_passwords_available() ) { $error = new WP_Error( 'application_passwords_disabled', __( 'Application passwords are not available.' ) ); } elseif ( ! wp_is_application_passwords_available_for_user( $user ) ) { $error = new WP_Error( 'application_passwords_disabled_for_user', __( 'Application passwords are not available for your account. Please contact the site administrator for assistance.' ) ); } if ( $error ) { /** * Fires when an application password failed to authenticate the user. * * @since 5.6.0 * * @param WP_Error $error The authentication error. */ do_action( 'application_password_failed_authentication', $error ); return $error; } /* * Strips out anything non-alphanumeric. This is so passwords can be used with * or without spaces to indicate the groupings for readability.History
Introduced in 5.6.0. Unchanged from 6.7.7 through 7.1.0.
Signature, return type and hooks compared across 5 parsed releases.
About this page
- Parsed data
- Generated from the wordpress-develop 6.9.7 tag, from
src/wp-includes/user.php, and regenerated for each WordPress release so it tracks the code rather than a snapshot of it. - Corrections
- Something wrong on this page? Report it and it gets fixed in the next regeneration.