Skip to content

Все для WordPress, веб-розробки — і не тільки

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

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