
🚀 Автоматический вход в 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, гарантируя, что хук отработает вовремя.

Вот минимальный работающий плагин:
1 <?php 2 /* 3 Plugin Name: Auto Login 4 Plugin URI: https://techblog.sdstudio.top/ 5 Version: 1.0.0 6 Author: Harri Bell-Thomas 7 */ 8 9 function 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 } 27 add_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, логин и пароль. В следующем блоке они вынесены в начало функции для удобства:
1 function 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 /* 3 Plugin Name: Auto Login 4 Plugin URI: https://techblog.sdstudio.top/ 5 Description: Automatic login for demo accounts. Configure accounts in the array below. 6 Version: 1.0.0 7 Author: 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 25 function 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 } 45 add_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, допустимо. Администратор с автологином по ссылке, дыра, которую злоумышленник находит за секунду.
Если демо-доступ для вас, канал продаж, автоматический вход перестаёт быть «приятным дополнением» и становится обязательным элементом конверсии. Одна ссылка вместо логина и пароля, это разница между «попробую позже» и «попробую сейчас».



