
🚀 Automaattinen WordPress-kirjautuminen PHP:llä: koodinpätkä demokäyttöön
Demokäyttö WordPressin hallintapaneeliin on vakiintunut tapa myydä lisäosia ja teemoja. Mahdollinen ostaja vierailee sivustolla, näkee tunnuksen ja salasanan, kopioi ne, siirtyy wp-login.php:hen, liittää... Liian monta vaihetta. Jokainen ylimääräinen klikkaus karsii osan yleisöstä.
Automaattinen kirjautuminen linkin kautta ratkaisee tämän ongelman radikaalisti: yksi linkki, ja käyttäjä on jo hallintapaneelissa, halutulla tunnuksella. Ei kopioi-liitä -rumbaa, ei sekaannusta kirjautumistietojen kanssa.
Alla on valmis PHP-pätkä, joka lisää tämän mekanismin mihin tahansa WordPress-sivustoon. Kaksikymmentä riviä koodia, räätälöintiin menee 2 minuuttia. Pätkä ei riipu teemasta, ei vedä mukaan ulkoisia riippuvuuksia ja aktivoituu kuten tavallinen lisäosa.
💡 Nopea yleiskatsaus:
- Lisäät URL-parametrin kirjautumisosoitteeseen (esimerkiksi
?autologin=demo), jawp_signon()kirjaa käyttäjän sisään määritetyllä tunnuksella ja ohjaa haluttuun osioon - Pätkä on muotoiltu erilliseksi WordPress-lisäosaksi: aktivoi se, ja se toimii heti; deaktivoi se, ja se poistuu käytöstä; teema ei ole sidoksissa siihen
- Perusversio palvelee yhtä tunnusta, laajennettu versio tukee mitä tahansa määrää tunnuksia eri rooleilla ja kohdepisteillä
- Räätälöinti projektiisi: vaihda kolme arvoa koodissa (tunnus, salasana, URL-avain), lataa lisäosa sivustolle ja saat kirjautumisen linkin kautta
Miten automaattinen kirjautuminen toimii: wp_signon-mekaniikka
Koko rakenteen ydin on wp_signon()-funktio. Se ottaa vastaan kirjautumistiedot: tunnuksen, salasanan ja "muista minut" -lipun, ja kirjaa sitten käyttäjän sisään täsmälleen kuten vakiolomake wp-login.php:ssä. Ero on siinä, että kutsu tapahtuu ohjelmallisesti, ilman ihmisen osallistumista. Käyttäjä yksinkertaisesti seuraa linkkiä ja päätyy sisälle.
after_setup_theme-koukku laukeaa ennen otsakkeiden lähetystä, mikä on kriittistä, koska wp_signon() asettaa auth-evästeen, ja evästeet on lähetettävä ennen mitään tulostusta selaimeen. Jos ripustat kutsun init-koukkuun tai myöhempään, kirjautuminen ei välttämättä toimi. Juuri siksi pätkä on muotoiltu erilliseksi lisäosaksi eikä lisätyksi teeman functions.php-tiedostoon: lisäosa latautuu WordPressin elinkaaren hyvin varhaisissa vaiheissa, mikä takaa, että koukku suoritetaan ajoissa.

Tässä on minimaalinen toimiva lisäosa:
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' );
Puretaan se rivi riviltä. Ehto $_GET['autologin'] === 'demo' tarkistaa, että vaadittu parametri on välitetty URL:ssä: wp-login.php?autologin=demo. $creds-taulukko sisältää tunnuksen, salasanan ja "muista minut" -lipun. wp_signon() parametrilla false tarkoittaa: älä käytä suojattua evästettä (sopii paikalliseen kehitykseen ja staging-sivustoille ilman HTTPS:ää). Onnistuessaan wp_redirect( admin_url() ) ohjaa käyttäjän hallintapaneeliin. Virhetilanteessa (väärä salasana, olematon käyttäjä) WordPress näyttää vakio-kirjautumislomakkeen paljastamatta, että automaattista kirjautumista yritettiin.
Räätälöinti projektiisi
Pätkän mukauttamiseen riittää kolmen arvon vaihtaminen: URL-parametri, tunnus ja salasana. Seuraavassa lohkossa ne on siirretty funktion alkuun mukavuussyistä:
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 }
Kolme sääntöä räätälöinnissä, jotka säästävät tuntikausia debuggausta.
Ensimmäinen: $user-parametrin arvo ei saa olla sama kuin WordPressin varatut avaimet. Neljä avainta on varattu: loggedout uloskirjautumiseen, action salasanan nollaukseen, redirect_to uudelleenohjauksiin kirjautumisen jälkeen ja wp_lang kielen vaihtamiseen. Jos käytät mitä tahansa näistä sanoista, automaattinen kirjautuminen ei joko toimi tai rikkoo ytimen vakiotoiminnan.
Toinen: salasana tallennetaan selkokielisenä lisäosan koodiin, joten älä koskaan käytä tätä pätkää ylläpitäjän tai päätoimittajan tunnuksille tuotantosivustolla. Demo-käyttäjä Tilaaja-roolilla tai korkeintaan Päätoimittajana on hyväksyttävä. Ylläpitäjä automaattisella linkkikirjautumisella on aukko, jonka hyökkääjä löytää sekunnissa.
Kolmas: jos sivusto toimii HTTPS:llä, korvaa false arvolla true wp_signon()-funktion toisessa argumentissa. Tämä ottaa käyttöön suojatun evästeen ja estää auth-tunnisteen kaappauksen verkkoliikenteestä.
Kirjautumisosoite näyttää tältä: https://your-site.com/wp-login.php?autologin=dummy. Sitä seuratessaan käyttäjä päätyy välittömästi hallintapaneeliin. Ei välinäyttöjä, ei tunnusten kopioi-liitä -toimintoa.
Monitunnus: yksi linkki, eri tunnukset
Entä jos demosivusto esittelee tuotteen eri rooleista? Ylläpitäjä näkee asetuspaneelin, päätoimittaja julkaisukäyttöliittymän, tilaaja henkilökohtaisen tilinsä. Tätä skenaariota varten laajennamme pätkää tukemaan useita tunnuksia:
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' );
Mekaniikka on sama, mutta $autologin_accounts-taulukko tallentaa kaikkien demokäyttäjien kirjautumistiedot, ja foreach käy ne läpi etsien osumaa URL-parametrin arvon perusteella. Uuden tunnuksen lisääminen tarkoittaa taulukkolohkon kopioimista uusilla user-, pass- ja location-arvoilla.
location-parametri hyväksyy minkä tahansa suhteellisen polun /wp-admin/-hakemiston sisällä: esimerkiksi options-general.php asetussivulle, edit.php artikkelilistalle tai post-new.php uuden artikkelin luomiseen. Voit määrittää myös täyden URL-osoitteen ohjataksesi julkiselle puolelle, mutta silloin korvaa admin_url( $account['location'] ) koodissa arvolla $account['location'].
Sisäänmenopiste on sama: https://your-site.com/wp-login.php?autologin=editor_demo, ja käyttäjä laskeutuu artikkelinluontisivulle eikä hallintapaneelin juureen. Demosivuston omistajalle tämä tarkoittaa täyttä hallintaa ensivaikutelmasta: jokainen käyttäjätyyppi näkee täsmälleen sen osan tuotteesta, joka on relevantti hänen kiinnostuksensa kannalta.
⁉️🤔 Usein kysytyt kysymykset
Onko turvallista tallentaa salasanoja lisäosan koodiin?
Ei, se ei ole turvallista. Pätkä on suunniteltu demosivustoille, joissa tunnukset ovat tarkoituksella julkisia eikä niillä ole todellisia oikeuksia. Tuotantosivustolla, jossa on oikeita käyttäjiä, tämä lähestymistapa ei ole hyväksyttävä: selkokielinen salasana voi vuotaa missä tahansa kooditarkastuksessa. Tuotantoskenaarioihin harkitse kertakäyttöistä token-mekanismia tai SSO:ta REST API:n kautta nonce-varmennuksella.
Miksi ei wp_login-toimintoa, vaan suoraan wp_signon?
wp_login-koukku laukeaa onnistuneen kirjautumisen jälkeen, se ei suorita itse valtuutusta.wp_signon()on funktio, joka todentaa käyttäjän: se tarkistaa salasananwp_authenticate()-funktiolla, asettaa evästeen ja laukaiseewp_login-koukun seurauksena. Jos sinun tarvitsee valtuuttaa käyttäjä ohjelmallisesti,wp_signonon työkalusi.
Voinko lisätä pätkän functions.php-tiedostoon erillisen lisäosan sijaan?
Kyllä, koodi toimii myös teeman
functions.php-tiedostossa. Mutta lisäosa on kätevämpi: automaattinen kirjautuminen ei ole sidoksissa teemaan eikä hajoa teemaa vaihdettaessa. Lisäksi lisäosan voi deaktivoida yhdellä klikkauksella muokkaamatta tiedostoja palvelimella.
Mitä tehdä, jos käyttäjä ei ole kirjautuneena is_user_logged_in-tarkistuksen mukaan kirjautumisen jälkeen?
Tämä on tunnettu
wp_signon()-funktion erikoisuus, kun sitä kutsutaan enneninit-koukkua: eväste on asetettu, mutta globaalia$current_user-muuttujaa ei ole vielä päivitetty. Ratkaisu on kutsuawp_set_current_user( $user->ID )pakotetusti heti onnistuneenwp_signon()-kutsun jälkeen. Meidän pätkässämme tämä ei ole kriittistä, koska välitön uudelleenohjaus seuraa, mutta skenaarioissa ilman uudelleenohjausta rivi on pakollinen.
Toimiiko pätkä multisite-ympäristössä?
Kyllä, mutta yhdellä varauksella.
wp_signon()valtuuttaa käyttäjän verkon nykyisellä sivustolla. Jos tunnus on olemassa vain yhdellä alisivustolla, automaattinen kirjautuminen ei toimi muilla. Koko verkon kattavaa ristiintodennusta varten käytäwp_signon()- jawp_set_auth_cookie()-funktioiden yhdistelmää pakotetulla evästeasennuksella pääverkkotunnukselle.
Automaattisen kirjautumisen pätkä: mitä jää käteen
Viisitoista riviä PHP:tä poistaa pääkitkan demosivuston myyntisuppilosta: tunnuksen ja salasanan kopioinnin. Yksi linkki, ja vierailija on tuotteen sisällä, valitsemassasi roolissa ja osiossa.
Perusversio kattaa "yksi demokäyttäjä" -skenaarion, laajennettu versio minkä tahansa määrän rooleja eri uudelleenohjauspisteillä. Kumpikaan ei riipu teemasta, eivät vaadi kolmannen osapuolen lisäosia ja aktivoituvat minuutissa.
Tärkein turvallisuussääntö on, ettei oikeuksia koroteta. Demokäyttäjä Tilaaja-roolilla tai korkeintaan Päätoimittajana on hyväksyttävä. Ylläpitäjä automaattisella linkkikirjautumisella on aukko, jonka hyökkääjä löytää sekunnissa.
Jos demokäyttö on sinulle myyntikanava, automaattinen kirjautuminen lakkaa olemasta "kiva lisä" ja siitä tulee pakollinen konversioelementti. Yksi linkki tunnuksen ja salasanan sijaan on ero "kokeilen myöhemmin" ja "kokeilen nyt" välillä.



