Skip to content
🚀 Automatyczne logowanie w WordPress na PHP: snippet do demo-dostępu

🚀 Automatyczne logowanie w WordPress na PHP: snippet do demo-dostępu

Demo-dostęp do panelu administracyjnego WordPress, standardowy chwyt przy sprzedaży wtyczek i motywów. Potencjalny klient wchodzi na stronę, widzi login i hasło, kopiuje je, przechodzi do wp-login.php, wkleja... Zbyt wiele kroków. Każdy zbędny klik odcina część odbiorców.

Automatyczne logowanie przez link rozwiązuje ten problem radykalnie: jedno kliknięcie i użytkownik jest już w panelu administracyjnym, na odpowiednim koncie. Żadnego kopiowania i wklejania, żadnych pomyłek z danymi logowania.

Poniżej gotowy skrypt PHP, który dodaje taką mechanikę do dowolnej witryny WordPress. Około 20 linii kodu, dostosowanie do własnych potrzeb zajmuje 2 minuty. Skrypt nie zależy od motywu, nie wymaga zewnętrznych zależności i aktywuje się jak zwykła wtyczka.

💡 Szybki przegląd:

  • Dodają Państwo parametr URL do adresu logowania (np. ?autologin=demo), a wp_signon() autoryzuje użytkownika na wskazanym koncie z przekierowaniem do odpowiedniej sekcji
  • Skrypt przygotowano jako osobną wtyczkę WordPress: po aktywacji działa od razu, po dezaktywacji przestaje, nie jest powiązany z motywem
  • Wersja podstawowa obsługuje jedno konto, rozszerzona wspiera dowolną liczbę kont z różnymi rolami i miejscami docelowymi
  • Konfiguracja pod własny projekt: zmieniają Państwo trzy wartości w kodzie (login, hasło, klucz URL), przesyłają wtyczkę na stronę i otrzymują logowanie przez link

Jak działa automatyczne logowanie: mechanika wp_signon

Sercem całej konstrukcji jest funkcja wp_signon(). Przyjmuje ona dane logowania: login, hasło i flagę remember, a następnie autoryzuje użytkownika tak samo, jak standardowy formularz na wp-login.php. Różnica polega na tym, że wywołanie odbywa się programowo, bez udziału człowieka. Użytkownik po prostu klika w link i znajduje się w środku.

Hook after_setup_theme uruchamia się przed wysłaniem nagłówków, co jest krytyczne, ponieważ wp_signon() ustawia ciasteczko auth, a ciasteczka muszą zostać wysłane przed jakimkolwiek wyjściem do przeglądarki. Jeśli podepnie się wywołanie do init lub późniejszego hooka, logowanie może nie zadziałać. Właśnie dlatego skrypt przygotowano jako osobną wtyczkę, a nie wstawiono do functions.php motywu: wtyczka ładuje się na najwcześniejszych etapach cyklu życia WordPressa, gwarantując, że hook wykona się na czas.

Pełny kod wtyczki automatycznego logowania WordPress

Oto minimalna działająca wtyczka:

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' );

Przeanalizujmy linia po linii. Warunek $_GET['autologin'] === 'demo' sprawdza, czy w URL przekazano odpowiedni parametr: wp-login.php?autologin=demo. Tablica $creds zawiera login, hasło i flagę „zapamiętaj". wp_signon() z parametrem false oznacza: nie używać bezpiecznego ciasteczka (odpowiednie dla rozwoju lokalnego i stron stagingowych bez HTTPS). W przypadku powodzenia wp_redirect( admin_url() ) przenosi użytkownika do panelu administracyjnego. W przypadku błędu (nieprawidłowe hasło, nieistniejący użytkownik) WordPress pokazuje standardowy formularz logowania, nie zdradzając, że miała miejsce próba automatycznego logowania.

Dostosowanie do własnego projektu

Aby dostosować skrypt, wystarczy zmienić trzy wartości: parametr URL, login i hasło. W poniższym bloku przeniesiono je na początek funkcji dla wygody:

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}

Trzy zasady podczas konfiguracji, które zaoszczędzą Państwu godzin debugowania.

Po pierwsze: wartość parametru $user nie może pokrywać się z zarezerwowanymi kluczami WordPressa. Zarezerwowane są cztery klucze: loggedout do wylogowania, action do resetowania hasła, redirect_to do przekierowań po zalogowaniu i wp_lang do zmiany języka. Jeśli użyją Państwo któregokolwiek z tych słów, automatyczne logowanie albo nie zadziała, albo zepsuje standardowe zachowanie rdzenia.

Po drugie: hasło jest przechowywane jawnym tekstem w kodzie wtyczki, dlatego nigdy nie należy używać tego skryptu dla kont administratora ani redaktora na działającej stronie. Użytkownik demonstracyjny z rolą Subscribera lub, w ostateczności, Editora, jest dopuszczalny. Administrator z automatycznym logowaniem przez link to dziura, którą atakujący znajduje w sekundę.

Po trzecie: jeśli strona działa po HTTPS, należy zamienić false na true w drugim argumencie wp_signon(). Włączy to bezpieczne ciasteczko i zapobiegnie przechwyceniu tokena auth podczas transmisji sieciowej.

Adres logowania będzie wyglądał następująco: https://ваш-сайт.com/wp-login.php?autologin=dummy. Po kliknięciu użytkownik natychmiast znajduje się w panelu administracyjnym. Żadnych ekranów pośrednich, żadnego kopiowania danych logowania.

A co, jeśli strona demonstracyjna pokazuje produkt z perspektywy różnych ról? Administrator widzi panel ustawień, redaktor interfejs publikacji, subskrybent panel klienta. W tym scenariuszu rozszerzamy skrypt o obsługę wielu kont:

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' );

Mechanika jest taka sama, ale tablica $autologin_accounts przechowuje dane logowania wszystkich użytkowników demonstracyjnych, a foreach przeszukuje je w poszukiwaniu dopasowania po wartości parametru URL. Dodanie nowego konta sprowadza się do skopiowania bloku tablicy z nowymi wartościami user, pass i location.

Parametr location przyjmuje dowolną ścieżkę względną wewnątrz /wp-admin/: na przykład options-general.php dla strony ustawień, edit.php dla listy wpisów lub post-new.php dla tworzenia nowej publikacji. Można też podać pełny URL do przekierowania na frontend, ale wtedy należy zamienić admin_url( $account['location'] ) na $account['location'] w kodzie.

Punkt wejścia jest ten sam: https://ваш-сайт.com/wp-login.php?autologin=editor_demo, a użytkownik trafia na stronę tworzenia wpisu, a nie do głównego panelu administracyjnego. Dla właściciela strony demonstracyjnej oznacza to pełną kontrolę nad pierwszym wrażeniem: każdy typ użytkownika widzi dokładnie tę część produktu, która jest istotna dla jego zainteresowań.

⁉️🤔 Często zadawane pytania

Czy bezpiecznie jest przechowywać hasła w kodzie wtyczki?

Nie, to niebezpieczne. Skrypt został zaprojektowany dla stron demonstracyjnych, gdzie konta są celowo publiczne i nie mają rzeczywistych uprawnień. Na produkcyjnej stronie z prawdziwymi użytkownikami takie podejście jest niedopuszczalne: hasło w jawnej postaci może wyciec podczas każdego audytu kodu. W scenariuszach produkcyjnych proszę rozważyć mechanizm jednorazowych tokenów lub SSO przez REST API z weryfikacją nonce.

Dlaczego nie użyto akcji wp_login, tylko bezpośrednio wp_signon?

Hook wp_login uruchamia się po udanym zalogowaniu, nie wykonuje samej autoryzacji. wp_signon() to funkcja, która uwierzytelnia użytkownika: sprawdza hasło przez wp_authenticate(), ustawia ciasteczko i dopiero w konsekwencji uruchamia wp_login. Jeśli potrzebują Państwo jedynie programowo autoryzować użytkownika, wp_signon jest właściwym narzędziem.

Czy można wstawić skrypt do functions.php zamiast osobnej wtyczki?

Tak, kod będzie działał również w functions.php motywu. Ale wtyczka jest wygodniejsza: automatyczne logowanie nie jest powiązane z motywem i nie przestanie działać przy jego zmianie. Ponadto wtyczkę można dezaktywować jednym kliknięciem, bez edytowania plików na serwerze.

Co zrobić, jeśli po zalogowaniu użytkownik nie jest autoryzowany w is_user_logged_in?

To znana specyfika wp_signon() przy wywołaniu przed hookiem init: ciasteczko jest ustawiane, ale globalny $current_user nie został jeszcze zaktualizowany. Rozwiązaniem jest wymuszenie wywołania wp_set_current_user( $user->ID ) natychmiast po udanym wp_signon(). W naszym skrypcie nie jest to krytyczne, ponieważ od razu następuje przekierowanie, ale w scenariuszach bez przekierowania ta linia jest obowiązkowa.

Czy skrypt działa na multisite?

Tak, ale z zastrzeżeniem. wp_signon() autoryzuje użytkownika w obrębie bieżącej witryny sieci. Jeśli konto istnieje tylko na jednej z podstron, na pozostałych automatyczne logowanie nie zadziała. Do autoryzacji w całej sieci proszę użyć kombinacji wp_signon() i wp_set_auth_cookie() z wymuszonym ustawieniem ciasteczka dla domeny głównej.

Skrypt automatycznego logowania: podsumowanie

Piętnaście linii PHP eliminuje z witryny demonstracyjnej główne tarcie w lejku sprzedażowym: kopiowanie loginu i hasła. Jeden link i odwiedzający jest wewnątrz produktu, z rolą i w sekcji, które Państwo wybrali.

Wersja podstawowa pokrywa scenariusz „jeden użytkownik demonstracyjny", rozszerzona, dowolną liczbę ról z różnymi punktami przekierowania. Obie nie zależą od motywu, nie wymagają zewnętrznych wtyczek i aktywują się w minutę.

Główna zasada bezpieczeństwa: nie podnosić uprawnień. Użytkownik demonstracyjny z rolą Subscribera lub, w ostateczności, Editora, jest dopuszczalny. Administrator z automatycznym logowaniem przez link to dziura, którą atakujący znajduje w sekundę.

Jeśli demo-dostęp jest dla Państwa kanałem sprzedaży, automatyczne logowanie przestaje być „miłym dodatkiem", a staje się obowiązkowym elementem konwersji. Jeden link zamiast loginu i hasła to różnica między „spróbuję później" a „spróbuję teraz".