Skip to content
🚀 Автоматический вход в WordPress на PHP: сниппет для демо-доступа

🚀 Автоматический вход в WordPress на PHP: сниппет для демо-доступа

Демо-доступ к админке WordPress, стандартный приём для продажи плагинов и тем. Потенциальный покупатель заходит на сайт, видит логин и пароль, копирует их, переходит на wp-login.php, вставляет... Слишком много шагов. Каждый лишний клик отсекает часть аудитории.

Автоматический вход по ссылке решает эту проблему радикально: одна ссылка, и пользователь уже в админке, под нужной учётной записью. Никакого копипаста, никакой путаницы с учётными данными.

Ниже готовый PHP-сниппет, который добавляет такую механику на любой WordPress-сайт. Кода на 20 строк, настройка под себя занимает 2 минуты. Сниппет не зависит от темы, не тянет сторонних зависимостей и активируется как обычный плагин.

💡 Быстрый обзор:

  • Добавляете URL-параметр в адрес входа (например ?autologin=demo), и wp_signon() авторизует пользователя под заданной учётной записью с редиректом в нужный раздел
  • Сниппет оформлен как отдельный плагин WordPress: активировали и сразу заработало, деактивировали и отключилось, тема не привязана
  • Базовая версия обслуживает одну учётную запись, расширенная поддерживает любое количество аккаунтов с разными ролями и точками назначения
  • Настройка под свой проект: меняете три значения в коде (логин, пароль, URL-ключ), загружаете плагин на сайт и получаете вход по ссылке

Как работает авто-вход: механика wp_signon

Ядро всей конструкции, функция wp_signon(). Она принимает учётные данные: логин, пароль и флаг remember, затем авторизует пользователя точно так же, как стандартная форма на wp-login.php. Разница в том, что вызов происходит программно, без участия человека. Пользователь просто переходит по ссылке и оказывается внутри.

Хук after_setup_theme срабатывает до отправки заголовков, это критично, потому что wp_signon() устанавливает auth cookie, а cookie должны уйти раньше любого вывода в браузер. Если повесить вызов на init или более поздний хук, логин может не сработать. Именно поэтому сниппет оформлен как отдельный плагин, а не вставлен в functions.php темы: плагин загружается на самых ранних стадиях жизненного цикла WordPress, гарантируя, что хук отработает вовремя.

Полный код плагина авто-входа WordPress

Вот минимальный работающий плагин:

1<?php
2/*
3Plugin Name: Auto Login
4Plugin URI: https://techblog.sdstudio.top/
5Version: 1.0.0
6Author: Harri Bell-Thomas
7*/
8
9function autologin() {
10 if ( $_GET['autologin'] !== 'demo' ) {
11 return;
12 }
13
14 $creds = array(
15 'user_login' => 'demo',
16 'user_password' => 'demo',
17 'remember' => true,
18 );
19
20 $user = wp_signon( $creds, false );
21
22 if ( ! is_wp_error( $user ) ) {
23 wp_redirect( admin_url() );
24 exit;
25 }
26}
27add_action( 'after_setup_theme', 'autologin' );

Разберём построчно. Условие $_GET['autologin'] === 'demo' проверяет, что в URL передан нужный параметр: wp-login.php?autologin=demo. Массив $creds содержит логин, пароль и флаг «запомнить». wp_signon() с параметром false означает: не использовать secure cookie (подходит для локальной разработки и staging-сайтов без HTTPS). При успехе wp_redirect( admin_url() ) перебрасывает пользователя в админку. При ошибке (неверный пароль, несуществующий пользователь) WordPress показывает стандартную форму входа, не подавая виду, что была попытка авто-логина.

Настройка под свой проект

Для адаптации сниппета достаточно изменить три значения: параметр URL, логин и пароль. В следующем блоке они вынесены в начало функции для удобства:

1function autologin() {
2 $param = 'autologin';
3 $user = 'dummy';
4 $pass = 'pa55word';
5
6 if ( $_GET[ $param ] !== $user ) {
7 return;
8 }
9
10 $creds = array(
11 'user_login' => $user,
12 'user_password' => $pass,
13 'remember' => true,
14 );
15
16 $login = wp_signon( $creds, false );
17
18 if ( ! is_wp_error( $login ) ) {
19 wp_redirect( admin_url() );
20 exit;
21 }
22}

Три правила при настройке, которые сэкономят вам часы отладки.

Первое: значение параметра $user не должно совпадать с зарезервированными ключами WordPress. Зарезервированы четыре ключа: loggedout для выхода из системы, action для сброса пароля, redirect_to для редиректов после входа и wp_lang для переключения локали. Если взять любое из этих слов, авто-вход либо не сработает, либо сломает стандартное поведение ядра.

Второе: пароль хранится открытым текстом в коде плагина, поэтому никогда не используйте этот сниппет для учётных записей администратора или редактора на живом сайте. Демо-пользователь с ролью Subscriber или, в крайнем случае, Editor, допустим. Администратор с автологином по ссылке, дыра, которую злоумышленник находит за секунду.

Третье: если сайт работает по HTTPS, замените false на true во втором аргументе wp_signon(). Это включит secure cookie и предотвратит перехват auth-токена при передаче по сети.

Адрес для входа будет выглядеть так: https://ваш-сайт.com/wp-login.php?autologin=dummy. При переходе пользователь мгновенно оказывается в админке. Никаких промежуточных экранов, никакого копипаста учётных данных.

Мульти-аккаунт: одна ссылка, разные учётные записи

Что если демо-сайт показывает продукт с разных ролей? Администратор видит панель настроек, редактор, интерфейс публикаций, подписчик, личный кабинет. Для этого сценария расширяем сниппет до поддержки нескольких учётных записей:

1<?php
2/*
3Plugin Name: Auto Login
4Plugin URI: https://techblog.sdstudio.top/
5Description: Automatic login for demo accounts. Configure accounts in the array below.
6Version: 1.0.0
7Author: Harri Bell-Thomas
8*/
9
10$autologin_param = 'autologin';
11
12$autologin_accounts = array(
13 array(
14 'user' => 'demo',
15 'pass' => 'demo',
16 'location' => 'wp-admin',
17 ),
18 array(
19 'user' => 'editor_demo',
20 'pass' => 'demo',
21 'location' => 'wp-admin/post-new.php',
22 ),
23);
24
25function autologin() {
26 global $autologin_param, $autologin_accounts;
27
28 foreach ( $autologin_accounts as $account ) {
29 if ( $_GET[ $autologin_param ] === $account['user'] ) {
30 $creds = array(
31 'user_login' => $account['user'],
32 'user_password' => $account['pass'],
33 'remember' => true,
34 );
35
36 $user = wp_signon( $creds, false );
37
38 if ( ! is_wp_error( $user ) ) {
39 wp_redirect( admin_url( $account['location'] ) );
40 exit;
41 }
42 }
43 }
44}
45add_action( 'after_setup_theme', 'autologin' );

Механика та же, но массив $autologin_accounts хранит учётные данные всех демо-пользователей, а foreach перебирает их в поисках совпадения по значению URL-параметра. Добавление новой учётной записи сводится к копированию блока массива с новыми значениями user, pass и location.

Параметр location принимает любой относительный путь внутри /wp-admin/: например, options-general.php для страницы настроек, edit.php для списка записей или post-new.php для создания новой публикации. Можно указать и полный URL для редиректа на фронтенд, но тогда замените admin_url( $account['location'] ) на $account['location'] в коде.

Точка входа та же: https://ваш-сайт.com/wp-login.php?autologin=editor_demo, и пользователь попадает на страницу создания записи, а не в корень админки. Для владельца демо-сайта это означает полный контроль над первым впечатлением: каждый тип пользователя видит именно ту часть продукта, которая релевантна его интересам.

⁉️🤔 Частые вопросы

Безопасно ли хранить пароли в коде плагина?

Нет, это небезопасно. Сниппет проектировался для демо-сайтов, где учётные записи заведомо публичны и не имеют реальных привилегий. На боевом сайте с настоящими пользователями такой подход неприемлем: пароль в открытом виде может протечь при любом аудите кода. Для production-сценариев рассмотрите механизм одноразовых токенов или SSO через REST API с nonce-верификацией.

Почему не wp_login action, а прямо wp_signon?

Хук wp_login срабатывает после успешного входа, он не выполняет саму авторизацию. wp_signon(), это функция, которая аутентифицирует пользователя: проверяет пароль через wp_authenticate(), устанавливает cookie и запускает wp_login уже как следствие. Если нужно только программно авторизовать пользователя, wp_signon ваш инструмент.

Можно ли вставить сниппет в functions.php вместо отдельного плагина?

Да, код будет работать и в functions.php темы. Но плагин удобнее: авто-вход не привязан к теме и не сломается при её смене. К тому же плагин можно деактивировать одним кликом, не редактируя файлы на сервере.

Что делать, если после входа пользователь не авторизован в is_user_logged_in?

Это известная особенность wp_signon() при вызове до хука init: cookie устанавливается, но глобальный $current_user ещё не обновлён. Решение, принудительно вызвать wp_set_current_user( $user->ID ) сразу после успешного wp_signon(). В нашем сниппете это не критично, потому что сразу следует редирект, но в сценариях без редиректа строчка обязательна.

Сниппет работает на мультисайте?

Да, но с оговоркой. wp_signon() авторизует пользователя в рамках текущего сайта сети. Если учётная запись существует только на одном из подсайтов, на других авто-вход не сработает. Для сквозной авторизации через всю сеть используйте комбинацию wp_signon() и wp_set_auth_cookie() с принудительной установкой cookie для основного домена.

Сниппет авто-входа: что в сухом остатке

Пятнадцать строк PHP избавляют демо-сайт от главного трения в воронке: копирования логина и пароля. Одна ссылка, и посетитель внутри продукта, с той ролью и в том разделе, которые вы выбрали.

Базовая версия покрывает сценарий «один демо-пользователь», расширенная, любое количество ролей с разными точками редиректа. Обе не зависят от темы, не требуют сторонних плагинов и активируются за минуту.

Главное правило безопасности, не повышать привилегии. Демо-пользователь с ролью Subscriber или, в крайнем случае, Editor, допустимо. Администратор с автологином по ссылке, дыра, которую злоумышленник находит за секунду.

Если демо-доступ для вас, канал продаж, автоматический вход перестаёт быть «приятным дополнением» и становится обязательным элементом конверсии. Одна ссылка вместо логина и пароля, это разница между «попробую позже» и «попробую сейчас».