Skip to content

Alt om WordPress, webutvikling — og mer til

🚀 Automatisk WordPress-innlogging i PHP: snippet for demotilgang

🚀 Automatisk WordPress-innlogging i PHP: snippet for demotilgang

Demotilgang til WordPress-administrasjonspanelet er en standard metode for å selge plugins og temaer. En potensiell kjøper besøker nettstedet, ser pålogging og passord, kopierer dem, går til wp-login.php, limer inn... For mange steg. Hvert ekstra klikk filtrerer bort en del av publikum.

Automatisk pålogging via lenke løser dette problemet radikalt: én lenke, og brukeren er allerede i administrasjonspanelet, under den nødvendige kontoen. Ingen kopiering og liming, ingen forvirring med påloggingsinformasjon.

Nedenfor finner du en ferdig PHP-snutt som legger til denne mekanismen på ethvert WordPress-nettsted. Tjue linjer med kode, tilpasning tar 2 minutter. Snutten er ikke avhengig av temaet, henter ikke inn eksterne avhengigheter og aktiveres som en vanlig plugin.

💡 Rask oversikt:

  • Du legger til en URL-parameter i påloggingsadressen (for eksempel ?autologin=demo), og wp_signon() autoriserer brukeren under den angitte kontoen med en videresending til ønsket seksjon
  • Snutten er utformet som en separat WordPress-plugin: aktiver den og den fungerer umiddelbart, deaktiver den og den er slått av, temaet er ikke knyttet til den
  • Grunnversjonen betjener én konto, den utvidede versjonen støtter et hvilket som helst antall kontoer med ulike roller og målpunkter
  • Tilpasning for ditt prosjekt: endre tre verdier i koden (brukernavn, passord, URL-nøkkel), last opp pluginen til nettstedet og få pålogging via lenke

Slik fungerer automatisk pålogging: wp_signon-mekanikken

Kjernen i hele strukturen er funksjonen wp_signon(). Den mottar påloggingsinformasjon: brukernavn, passord og husk meg-flagg, og autoriserer deretter brukeren nøyaktig som standardskjemaet på wp-login.php. Forskjellen er at kallet skjer programmatisk, uten menneskelig medvirkning. Brukeren følger ganske enkelt lenken og havner inne.

after_setup_theme-hooken kjøres før headere sendes, noe som er kritisk fordi wp_signon() setter en autentiseringsinformasjonskapsel, og informasjonskapsler må sendes før noe output til nettleseren. Hvis du henger kallet på init eller en senere hook, kan det hende påloggingen ikke fungerer. Det er nettopp derfor snutten er utformet som en separat plugin i stedet for å settes inn i temaets functions.php: pluginen lastes på de aller tidligste stadiene av WordPress sin livssyklus, noe som garanterer at hooken vil kjøre i tide.

Komplett kode for WordPress-plugin for automatisk innlogging

Her er den minimale fungerende pluginen:

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

La oss bryte det ned linje for linje. Betingelsen $_GET['autologin'] === 'demo' sjekker at den nødvendige parameteren er sendt i URL-en: wp-login.php?autologin=demo. $creds-arrayet inneholder brukernavn, passord og «husk meg»-flagg. wp_signon() med parameteren false betyr: ikke bruk sikker informasjonskapsel (egnet for lokal utvikling og staging-nettsteder uten HTTPS). Ved suksess videresender wp_redirect( admin_url() ) brukeren til administrasjonspanelet. Ved feil (feil passord, ikke-eksisterende bruker) viser WordPress standard påloggingsskjema uten å avsløre at det var et forsøk på automatisk pålogging.

Tilpasning for ditt prosjekt

For å tilpasse snutten er det nok å endre tre verdier: URL-parameteren, brukernavn og passord. I neste blokk er de flyttet til begynnelsen av funksjonen for enkelhets skyld:

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}

Tre regler ved tilpasning som vil spare deg for timer med feilsøking.

For det første: verdien av parameteren $user må ikke samsvare med reserverte nøkler i WordPress. Fire nøkler er reservert: loggedout for utlogging, action for tilbakestilling av passord, redirect_to for videresending etter pålogging, og wp_lang for bytte av språk. Hvis du bruker noen av disse ordene, vil automatisk pålogging enten ikke fungere eller ødelegge standard kjerneatferd.

For det andre: passordet lagres som ren tekst i plugin-koden, så bruk aldri denne snutten for administrator- eller redaktørkontoer på et produksjonsnettsted. En demobruker med abonnentrollen eller, i høyden, redaktør, er akseptabelt. En administrator med automatisk pålogging via lenke er et hull en angriper vil finne på et sekund.

For det tredje: hvis nettstedet kjører på HTTPS, erstatt false med true i det andre argumentet til wp_signon(). Dette vil aktivere sikker informasjonskapsel og forhindre avlytting av autentiseringstoken under nettverksoverføring.

Påloggingsadressen vil se slik ut: https://your-site.com/wp-login.php?autologin=dummy. Når man følger den, havner brukeren umiddelbart i administrasjonspanelet. Ingen mellomliggende skjermer, ingen kopiering og liming av påloggingsinformasjon.

Flerkonto: én lenke, ulike kontoer

Hva om demosiden viser produktet fra ulike roller? Administratoren ser innstillingspanelet, redaktøren ser publiseringsgrensesnittet, abonnenten ser personlig konto. For dette scenarioet utvider vi snutten til å støtte flere kontoer:

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

Mekanikken er den samme, men $autologin_accounts-arrayet lagrer påloggingsinformasjonen til alle demobrukere, og foreach itererer gjennom dem på jakt etter et samsvar med URL-parameterverdien. Å legge til en ny konto består i å kopiere array-blokken med nye verdier for user, pass og location.

Parameteren location aksepterer enhver relativ sti innenfor /wp-admin/: for eksempel options-general.php for innstillingssiden, edit.php for innleggslisten, eller post-new.php for å opprette et nytt innlegg. Du kan også angi en fullstendig URL for videresending til forsiden, men da må du erstatte admin_url( $account['location'] ) med $account['location'] i koden.

Inngangspunktet er det samme: https://your-site.com/wp-login.php?autologin=editor_demo, og brukeren lander på siden for opprettelse av innlegg i stedet for admin-roten. For eieren av demosiden betyr dette full kontroll over førsteinntrykket: hver type bruker ser nøyaktig den delen av produktet som er relevant for deres interesser.

⁉️🤔 Ofte stilte spørsmål

Er det trygt å lagre passord i plugin-kode?

Nei, det er ikke trygt. Snutten ble designet for demosider der kontoer er bevisst offentlige og ikke har reelle rettigheter. På et produksjonsnettsted med ekte brukere er denne tilnærmingen uakseptabel: passordet i ren tekst kan lekke under enhver kodegjennomgang. For produksjonsscenarioer bør du vurdere en mekanisme med engangstoken eller SSO via REST API med nonce-verifisering.

Hvorfor ikke wp_login-actionen, men direkte wp_signon?

wp_login-hooken kjøres etter en vellykket pålogging, den utfører ikke selve autorisasjonen. wp_signon() er funksjonen som autentiserer brukeren: den sjekker passordet via wp_authenticate(), setter informasjonskapselen og utløser wp_login som en konsekvens. Hvis du bare trenger å programmatisk autorisere en bruker, er wp_signon ditt verktøy.

Kan jeg sette inn snutten i functions.php i stedet for en separat plugin?

Ja, koden vil også fungere i temaets functions.php. Men en plugin er mer praktisk: automatisk pålogging er ikke knyttet til temaet og vil ikke slutte å fungere ved temabytte. I tillegg kan pluginen deaktiveres med ett klikk uten å redigere filer på serveren.

Hva gjør jeg hvis brukeren etter pålogging ikke er autorisert i is_user_logged_in?

Dette er en kjent særegenhet ved wp_signon() når den kalles før init-hooken: informasjonskapselen er satt, men den globale $current_user er ikke oppdatert ennå. Løsningen er å tvinge frem et kall til wp_set_current_user( $user->ID ) umiddelbart etter en vellykket wp_signon(). I vår snutt er ikke dette kritisk fordi en videresending følger umiddelbart, men i scenarioer uten videresending er linjen obligatorisk.

Fungerer snutten på multisite?

Ja, men med et forbehold. wp_signon() autoriserer brukeren innenfor det gjeldende nettstedet i nettverket. Hvis kontoen bare eksisterer på ett av undersidene, vil automatisk pålogging ikke fungere på de andre. For kryssautentisering gjennom hele nettverket, bruk en kombinasjon av wp_signon() og wp_set_auth_cookie() med tvungen installasjon av informasjonskapsel for hoveddomenet.

Snutt for automatisk pålogging: hva er konklusjonen

Femten linjer med PHP eliminerer hovedfriksjonen i demosidekanalen: kopiering av brukernavn og passord. Én lenke, og den besøkende er inne i produktet, med rollen og i seksjonen du valgte.

Grunnversjonen dekker scenarioet «én demobruker», den utvidede dekker et hvilket som helst antall roller med ulike videresendingspunkter. Begge er ikke avhengige av temaet, krever ikke tredjepartsplugins og aktiveres på et minutt.

Hovedsikkerhetsregelen er ikke å opphøye rettigheter. En demobruker med abonnentrollen eller, i høyden, redaktør, er akseptabelt. En administrator med automatisk pålogging via lenke er et hull en angriper vil finne på et sekund.

Hvis demotilgang er en salgskanal for deg, slutter automatisk pålogging å være et «hyggelig tillegg» og blir et obligatorisk konverteringselement. Én lenke i stedet for brukernavn og passord er forskjellen mellom «jeg prøver senere» og «jeg prøver nå».