
🚀 Автоматичний вхід в 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, допустимо. Адміністратор з автологіном за посиланням, діра, яку зловмисник знаходить за секунду.
Якщо демо-доступ для вас, канал продажів, автоматичний вхід перестає бути «приємним доповненням» і стає обов’язковим елементом конверсії. Одне посилання замість логіна й пароля — це різниця між «спробую пізніше» і «спробую зараз».



