
🚀 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), awp_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.

Oto minimalna działająca wtyczka:
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' );
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:
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 }
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.
Multi-konto: jeden link, różne konta
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 /* 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' );
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_loginuruchamia się po udanym zalogowaniu, nie wykonuje samej autoryzacji.wp_signon()to funkcja, która uwierzytelnia użytkownika: sprawdza hasło przezwp_authenticate(), ustawia ciasteczko i dopiero w konsekwencji uruchamiawp_login. Jeśli potrzebują Państwo jedynie programowo autoryzować użytkownika,wp_signonjest 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.phpmotywu. 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 hookieminit: ciasteczko jest ustawiane, ale globalny$current_usernie został jeszcze zaktualizowany. Rozwiązaniem jest wymuszenie wywołaniawp_set_current_user( $user->ID )natychmiast po udanymwp_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ć kombinacjiwp_signon()iwp_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".



