8 способов изменить пароль в WordPress (авторизоваться)

В WordPress можно восстанавливать и изменять пароль пользователя, если у вас есть доступ к email пользователя или вы уже авторизованы. А как поменять (установить пароль) любому пользователю если вы не знаете пароль администратора? Ниже рассмотрим разные варианты изменения пароля для разных ситуаций, а также варианты авторизоваться в системе не имя пароля.

Узнать пароль пользователя WordPress невозможно, потому что пароли хранятся в БД в закодированном виде (в виде хэша) и единственный способ узнать пароль по хэшу — это его угадать. Такой подбор паролей называется Брут-форс.

Пароль хранится в базе данных в поле user_pass таблицы wp_users.

Авторизация — PHP

Чтобы не изменять пароль пользователя, но при этом попасть в админку, можно использовать функцию wp_set_auth_cookie().

Код ниже показывает как авторизоваться в качестве администратора не меняя его пароль.

Вставьте код в файл темы functions.php. Затем зайдите на любую страницу сайта и допишите в конец URL ?login_as_admin. После этого вы автоматически будите авторизованы как администратор.

if ( isset( $_GET['login_as_admin'] ) ) {
	add_action( 'init', function () {
		$users = get_users( [ 'role' => 'administrator' ] );
		wp_set_auth_cookie( $users[0]->ID );

		wp_safe_redirect( remove_query_arg( 'login_as_admin' ) );
		exit;
	} );
}

После использования этого кода, его обязательно нужно удалить!

Более продвинутый вариант кода выше:

/**
 * Примеры:
 * https://example.com?login_as=admin
 * https://example.com?login_as=124
 * https://example.com?login_as=user-test@gmail.com
 */
new class {
	private string $query_val;
	private string $query_key = 'login_as';

	public function __construct() {
		$this->query_val = $_GET[ $this->query_key ] ?? '';

		if ( $this->query_val && wp_get_environment_type() === 'local' ) {
			add_action( 'init', [ $this, 'init' ] );
		}
	}

	public function init(): void {
		if ( 'admin' === $this->query_val ) {
			$users = get_users( [ 'role' => 'administrator', ] );
			$this->set_user_and_redirect( $users[0] ?? false );
		}

		if ( is_numeric( $this->query_val ) ) {
			$user = get_user_by( 'id', $this->query_val );
			$this->set_user_and_redirect( $user );
		}

		if ( is_email( $this->query_val ) ) {
			$user = get_user_by( 'email', $this->query_val );
			$this->set_user_and_redirect( $user );
		}
	}

	/**
	 * @param WP_User|false $user
	 */
	private function set_user_and_redirect( $user ): void {
		if ( empty( $user->ID ) ) {
			wp_die( 'Указанного пользователя не существует' );
		}

		wp_set_auth_cookie( $user->ID );
		wp_safe_redirect( remove_query_arg( $this->query_key ) );
		exit;
	}

};

Авторизация — WP-CLI

WP-CLI скрипт ниже позволяет создавать одноразовые ссылки для входа в WordPress без ввода пароля и двухфакторной аутентификации.

Ссылка валидна короткое время (по умолчанию 5 минут) и удаляется сразу после первого входа.

Идеально подходит для быстрого доступа на Dev или Prod, когда нет активной сессии, а SSH доступ уже есть.

Пример использования:

wp temp-login create 1818

Success: https://example.com/?temp_login_token=DRilA...EUkZjD

# Можно также указать логин или email пользоваетя и время жизни
wp temp-login create user_login --minutes=10
wp temp-login create admin@example.com --minutes=10

Код:

GitHub
<?php
/**
 * Plugin Name: Temp Login Links (WP-CLI)
 * Description: Генерация временных ссылок для входа через WP-CLI.
 * Version: 1.3
 * Author: campusboy
 *
 * Скачать к себе в текущую директрою
 * curl -L https://gist.github.com/campusboy87/9fa31f35dce933d48a5204d978e92c29/raw -o wp-login-cli.php
 *
 * Dev notes / examples:
 *   wp temp-login create user@example.com
 *   wp temp-login create 123 --minutes=10
 *   wp temp-login create username --minutes=5
 *
 *   wp user list --role=administrator --fields=ID,user_login,user_email
 *   wp user meta list 123
 *   URL: https://example.com/?temp_login_token=<token>
 */
if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

class WP_CLI_Login {

	private string $token;
	private $user_id;

	public function __construct() {
		$this->token = $_GET['temp_login_token'] ?? '';

		if ( $this->token ) {
			$this->token   = wp_unslash( $_GET['temp_login_token'] );
			$this->user_id = $this->get_once_user_id_by_token();

			if ( $this->user_id ) {
				add_action( 'init', [ $this, 'auth' ] );

				// Отключаем WP 2FA при входе через temp_login_token
				define( 'DISABLE_2FA_LOGIN', true );
			} else {
				wp_die( 'Invalid or expired token', 'Temp Login', [ 'response' => 403 ] );
			}
		}
	}

	/**
	 * Авторизовываем
	 *
	 * @return void
	 */
	public function auth() {
		$user = get_user_by( 'id', $this->user_id );

		if ( ! $user ) {
			wp_die( 'User not found', 'Temp Login', [ 'response' => 404 ] );
		}

		wp_clear_auth_cookie();
		wp_set_current_user( $user->ID );
		wp_set_auth_cookie( $user->ID, true );
		do_action( 'wp_login', $user->user_login, $user );

		wp_redirect( home_url() );
		exit;
	}

	/**
	 * Получает ID пользователя по токену разовой авторизации
	 *
	 * @return false|int
	 */
	private function get_once_user_id_by_token() {
		static $user_id = null;

		if ( $user_id !== null ) {
			return $user_id;
		}

		global $wpdb;

		// Ищем пользователя с этим токеном
		$result = $wpdb->get_row( $wpdb->prepare(
			"SELECT user_id, meta_value FROM {$wpdb->usermeta} 
            WHERE meta_key = %s",
			'temp_login_token_' . $this->token
		) );

		if ( ! $result ) {
			return false;
		}

		$data    = maybe_unserialize( $result->meta_value );
		$user_id = (int) $result->user_id;

		// Проверяем срок действия
		if ( ! isset( $data['expires'] ) || $data['expires'] < time() ) {
			delete_user_meta( $user_id, 'temp_login_token_' . $this->token );

			return false;
		}

		// Удаляем токен после использования (одноразовый)
		delete_user_meta( $user_id, 'temp_login_token_' . $this->token );

		return $user_id;
	}

}

new WP_CLI_Login();

if ( defined( 'WP_CLI' ) && WP_CLI ) {
	class Temp_Login_CLI_Command {

		public function create( $args, $assoc_args ) {
			if ( empty( $args[0] ) ) {
				WP_CLI::error( 'Specify user ID, login or email.' );
			}

			$who  = $args[0];
			$user = null;

			if ( is_numeric( $who ) ) {
				$user = get_user_by( 'id', intval( $who ) );
			}

			if ( ! $user ) {
				$user = get_user_by( 'login', $who );
			}

			if ( ! $user ) {
				$user = get_user_by( 'email', $who );
			}

			if ( ! $user ) {
				WP_CLI::error( 'User not found.' );
			}

			$minutes = isset( $assoc_args['minutes'] ) ? intval( $assoc_args['minutes'] ) : 5;
			if ( $minutes <= 0 ) {
				$minutes = 5;
			}

			$token   = wp_generate_password( 64, false, false );
			$expires = time() + ( $minutes * MINUTE_IN_SECONDS );

			// Сохраняем токен в user meta
			update_user_meta( $user->ID, 'temp_login_token_' . $token, [
				'expires' => $expires,
				'created' => time(),
			] );

			$url = add_query_arg( 'temp_login_token', $token, site_url( '/' ) );
			WP_CLI::success( $url );
		}

		/**
		 * Очистка истекших токенов
		 */
		public function cleanup( $args, $assoc_args ) {
			global $wpdb;

			$meta_keys = $wpdb->get_results(
				"SELECT umeta_id, user_id, meta_key, meta_value 
                FROM {$wpdb->usermeta} 
                WHERE meta_key LIKE 'temp_login_token_%'"
			);

			$cleaned = 0;
			foreach ( $meta_keys as $meta ) {
				$data = maybe_unserialize( $meta->meta_value );
				if ( isset( $data['expires'] ) && $data['expires'] < time() ) {
					delete_metadata_by_mid( 'user', $meta->umeta_id );
					$cleaned ++;
				}
			}

			WP_CLI::success( "Cleaned {$cleaned} expired tokens." );
		}
	}

	WP_CLI::add_command( 'temp-login', 'Temp_Login_CLI_Command' );
}

Смена пароля — профиль в админке

Если вы авторизованы, то пароль можно изменить на странице профиля Пользователи → Ваш профиль. Если вы при этом еще и администратор, то пароль можно изменить любому пользователю, перейдя в редактирование пользователя со страницы Пользователи → Все пользователи.

Изменение пароля в профиле пользователя

Смена пароля — email (восстановление пароля)

Если вы забыли пароль, но у вас есть доступ к email пользователя, то пароль можно восстановить. Для этого нужно:

  1. Перейти на страницу Входа: /wp-login.php.
  2. Кликнуть по ссылке «Забыли пароль?».
  3. Ввести email или имя пользователя, пароль для которого нужно восстановить.
  4. Перейти по ссылке на восстановление пароля, полученной на email (если указали имя пользователя, то нужно проверить email соответствующий имени пользователя).
  5. Ввести новый пароль в форме на которую вы попали кликнув по ссылке в письме.
  6. Войти на сайт используя новый пароль.
Восстановление пароля в WordPress

Смена пароля — phpMyAdmin

Почти все хостинг провайдеры предоставляют доступ к phpMyAdmin — панель управления базой данных.

Там установить пароль любого пользователя очень просто. Для этого нужно зайти в таблицу wp_users и нажать «редактировать» (иконку карандаша) рядом с пользователем, пароль которого хотите поменять. В результате вы увидите такую форму:

Установка нового пароля через phpMyAdmin

Измените хэш код в поле user_pass на новый пароль. И обязательно укажите MD5 для установленного значения (так введенный текстовый пароль будет захэширован и WP сможет его потом «распознать»).

Заметка: при первой авторизации MD5 хэш автоматически будет изменен на более надежный хэш, который используется в вашей версии WordPress.

Смена пароля — MySQL

Для установки нового пароля можно использовать SQL запрос.

Пример ниже, показывает как сменить пароль администратора WordPress, зная его логин. Тут новый пароль будет — newpass, а логин администратора — admin:

UPDATE wp_users SET user_pass = MD5('newpass') WHERE user_login = 'admin'

Если вдруг вы забыли логин, но точно помните, что вы были первым юзером на блоге, а значит ваш ID равен 1, то можно сбросить пароль по ID — WHERE ID = 1:

UPDATE wp_users SET user_pass = MD5('newpass') WHERE ID = 1;

Или можно сменить пароль зная email юзера:

UPDATE wp_users SET user_pass = MD5('newpass') WHERE user_email = 'adminko@gmail.com';

MD5('newpass') = e6053eb8d35e02ae40beeeacef203c1a

Пример запуска MySQL запроса из консоли

Для начала нужно зайти в консоль и подключиться к БД, такой командой:

mysql -u USERNAME -pPASSWORD -h HOST_NAME_OR_IP DATABASE_NAME

или без указания хоста (если вы работает в консоли из среды самого хостинга)

mysql -u USERNAME -pPASSWORD DATABASE_NAME

Далее, нужно запустить вышеупомянутый запрос, так:

mysql> UPDATE wp_users SET user_pass = MD5('newpass') WHERE user_login = 'admin';

Чтобы узнать название таблиц в базе данных my_database, используйте команду:

mysql> SHOW TABLES IN my_database;

+---------------------------+
| Tables_in_my_database     |
+---------------------------+
| wp_commentmeta            |
| wp_comments               |
| wp_options                |
| wp_postmeta               |
| wp_posts                  |
| wp_term_relationships     |
| wp_term_taxonomy          |
| wp_termmeta               |
| wp_terms                  |
| wp_usermeta               |
| wp_users                  |
+---------------------------+

Чтобы получить список логинов пользователей из таблицы юзеров, используйте команду:

mysql> SELECT user_login FROM wp_users;

+----------------+
| user_login     |
+----------------+
| abalak         |
| AbamFaw        |
| admin          |
+----------------+

Смена пароля — PHP

Новый пароль можно установить PHP кодом, с помощью функции wp_set_password().

Вставьте следующий код в файл темы functions.php. Затем зайдите на любую страницу сайта и допишите в конец URL ?init_new_pass_set=anton.

В результате пароль пользователя anton будет изменен на newpass.

if( isset( $_GET['init_new_pass_set'] ) && $login = $_GET['init_new_pass_set'] ){
	add_action( 'init', function() use ( $login ){
		wp_set_password( 'newpass', get_user_by( 'login', $login )->ID );
		wp_die( "Пароль юзера `$login` изменен" );
	} );
}

После использования этого кода, его обязательно нужно удалить!

Смена пароля — WP-CLI

Установить пароль пользователя можно командой wp user update.

Этот пример показывает как для пользователя с логином USERNAME установить пароль PASSWORD:

wp user update USERNAME --user_pass="PASSWORD"

Получить список пользователей (чтобы узнать логин) можно командой wp user list:

wp user list

+----+---------------+--------------+---------------------+---------------------+---------------+
| ID | user_login    | display_name | user_email          | user_registered     | roles         |
+----+---------------+--------------+---------------------+---------------------+---------------+
| 4  | aleksej-nnn   | Alex         | alsey119@yandex.ru  | 2018-04-24 21:04:24 | administrator |
| 7  | denis         | Denis        | deis@denis.pro      | 2018-06-06 23:30:54 | subscriber    |
| 9  | shk_user      | shk_user     | sheer@qsologies.com | 2018-08-11 13:27:09 | subscriber    |
| 8  | vladlu        | vladlu       | spata@famail.com    | 2018-03-26 00:11:48 | editor        |
+----+---------------+--------------+---------------------+---------------------+---------------+

Сброс паролей — WP-CLI

Можно установить авто-сгенерированные пароли для указанных пользователей, для этого есть команда wp user reset-password.

Этот пример показывает как сбросить пароль для двух пользователей и отправить им сообщение о том что пароль был изменен.

wp user reset-password admin editor
	Reset password for admin.
	Reset password for editor.
	Success: Passwords reset.

Пользователь в результате получит такое сообщение на почту:

4 комментария