Kako stvoriti vlastitu stranicu za registraciju u WordPress Multisite. Kako stvoriti vlastitu stranicu za registraciju u WordPress multisite bonus. Zaštita od Spamera

Jednokratni linkovi mogu se koristiti u različitim situacijama: kako bi se osigurao privremeni pristup datoteci ili stranici ili za potvrdu registracije. U ovoj lekciji pokazat ćemo kako generirati i provesti raspoložive URL adrese.

Stvaranje URL-a

Pretpostavimo da naša stranica ima sustav provjere autentičnosti korisnika. Nakon registracije tražimo od korisnika da prođe postupak provjere e-pošte. Da biste stvorili takve veze možemo koristiti posebni parametar tokena. Primjer takve veze:

Http: //example.com/aktivnost? Token \u003d ee97780 ...

Bez baze podataka ne možemo učiniti ovdje, pa pogledamo stol s kojim ćemo raditi.

Napravite tablicu Pending_users (token char (40) ne , korisničko ime varchar (45) ne , tstamp cijeli broj nepotpisani ne , primarni ključ (token);

U tablici ćemo pohraniti 3 polja: token, korisničko ime i vrijeme. Za generiranje tokena koristit ćemo funkciju SHA1 (), koja daje niz od 40 znakova. Tstamp polje će pohraniti vrijeme generiranja tokena tako da možemo pratiti veze s zastarjelom.

Postoji mnogo načina za generiranje tokena, ali u ovoj lekciji koristit ćemo UNIQID () i SHA1 () funkcije. Bez obzira na način generiranja tokena, pobrinite se da će generirane vrijednosti biti različiti i vjerojatnost duplikata je minimalna.

$ token \u003d Sha1 (uniqid ($ korisničko ime, istina));

Kao parametar, funkcija Uniqid () uzima niz, a izlaz daje jedinstveni identifikator na temelju prenesenog argumenta i trenutno vrijeme. Također, kao drugi argument, ova funkcija dobiva boolean vrijednost koja će dati jedinstveni signal da doda više dodatnih znakova kako bi se povećala vjerojatnost jedinstvene vrijednosti. Značajka SHA1 ima jedinstveni identifikator i stvara hash.

Nakon rada na dvije funkcije, imat ćemo jedinstveni token koji može koristiti za generiranje URL adresa. Sada moramo ga staviti u bazu podataka:

$ Upit \u003d $ db-\u003e Priprema ("umetak u Pending_users (korisničko ime, token, Tstamp) vrijednosti (?,?)"); $ Upit-\u003e Execute (polja ($ korisničko ime, $ token, $ _Server ["zahtjev_time"]);

Da bismo trebali znati koji korisnik treba aktivirati, snimit ćemo i prijaviti se na stol. U primjeru, više prilagođeno za pravu web-lokaciju, možete koristiti korisnički ID.

Sada kada imamo sve potrebne informacije, možemo stvoriti privremenu URL adresu:

$ URL \u003d "http://example.com/activate.php?token\u003d$Token";

$ Poruka \u003d.<<

Ček

Sada trebamo skriptu, zahvaljujući kojem ćemo provjeriti. Sve što trebamo učiniti je usporediti token s URL adrese i token iz baze. Ako postoji takva stvar, a vrijeme njegovog života nije isteklo, onda je sve u redu.

// dobiti ako je token (istod ($ _ dobiti ["token"]) && preg_match ("/ ^ (40) $ / i", $ _get ["token"])) ($ token \u003d $ _get ["token" ];);) Drugo (baciti novu iznimku ("tocken nije valjan".);) // Provjera $ Query \u003d $ DB-\u003e Priprema token ("Odabir korisničkog imena, Tstamp od Pending_Users gdje token \u003d?"); $ Upit-\u003e Execute (niz ($ token)); $ Row \u003d $ Query-\u003e Fetch (pdo :: Fetch_ASSOC); $ Query-\u003e Zakupnik (); ako ($ redak) (ekstrakt ($ redak);) drugo (baciti novu iznimku ("tocken nije važeći.");) // Aktivirajte korisnički račun // // uklonite token iz baze $ upita \u003d $ DB\u003e Priprema ("Izbriši iz Pending_users gdje je korisničko ime \u003d i token \u003d? I Tstamp \u003d?",); $ Upit-\u003e Execute (polja ($ korisničko ime, $ token, $ tstamp));

Također trebamo osigurati testiranje žetona, čiji je životni vijek istekao:

// 1 dan u sekundama \u003d 60 sekundi * 60 minuta * 24 sata $ delta \u003d 86400; // Provjerite je li ($ _Server ["zahtjev_time"] - $ Tstamp\u003e $ Delta) (baciti novu iznimku ("Tocken Lifetime je istekao".);) // Aktivirajte prilagođeni račun // ...

Dakle, imat ćemo dva provjera: jedan na valjanosti tokena, drugi u vrijeme postojanja.

Ishod

Ova se metoda može primijeniti ne samo za aktiviranje korisničkih računa, nego iu drugim potrebama: na primjer, osigurati jedan ili privremeni pristup resursu ili usluzi.

Osim svega ovoga, možete stvoriti skriptu koja će ukloniti tokene koji nikada nisu koristili. Ova skripta se može lansirati s vremena na vrijeme ili se prijaviti za ovaj cron.

Segal ćemo razmotriti iskorištavanje kritične prijenosne ranjivosti u popularnom CMS Joomli, koji je krajem listopada grmio na internetu. Bit će o ranjivosti s brojevima CVE-2016-8869, CVE-2016-8870. i CVE-2016-9081, Sva trojica se pojavljuju iz jednog komada koda, što je nekad bilo u dubinama okvira, čekajući vlastite sate, tada se oslobode i donose s njim kaos, hakirao mjesta i suze u bilo nevinim korisnicima ove Joomle. Samo najzanimljiviji i hrabri programeri čije su oči crvene od svjetla monitora, a tipkovnice su pune krušnim mrvicama, uspjeli su izazvati otečenu pahusu i nametnuti glavu na oltaru popravaka.

Upozorenje

Sve informacije se pružaju isključivo u informativne svrhe. Ni urednici ni autor nisu odgovorni za moguću štetu uzrokovanu materijalima ovog članka.

Zašto je sve počelo

Dana 6. listopada 2016. godine, Damis Palma (Demis Palma) stvorila je temu razmjene stack, koja se raspitala: zašto, u stvari, u Joomla verziji 3.6 postoje dvije metode za registraciju s istim imenom ()? Prvi se nalazi u kontroleru korisnike conssessControles, a drugi je u korisničkom croatiantrollerser. Damis je htio znati je li korisnici crijeva :: Registracija () metoda se negdje koristi, ili je samo evolucijski anakronizam koji ostaje od stare logike. Bio je uznemiren činjenicom da, čak i ako se ova metoda ne koristi u bilo kojoj prezentaciji, može se nazvati korištenjem formiranog zahtjeva. Kakav je bio odgovor od developera pod nadimkom Itoctopusa, potvrđujući: problem stvarno postoji. I poslao izvješće Joomla programerima.

Dalje, događaji su razvili najbrži način. 18. listopada, Joomla developers prihvaćaju Damis izvješće, koji je do tada ugušio POC, omogućujući vam da registrirate korisnika. Objavio je poruku na njegovoj stranici, gdje je općenito ispričao o problemu i misli o tome. Istog dana izlazi nova verzija Joomla 3.6.3, koja još uvijek sadrži ranjivi kod.

Nakon toga, David Tampellini (Davide Tamplellini) okreće bug u stanje registracije nije jednostavan korisnik, već administrator. I 21. listopada, Sigurnosni tim Joomla stigao je novi slučaj. Već govori o prikupljanju povlastica. Istog dana najava se pojavljuje na internetskoj stranici Joomla koja će u utorak, 25. listopada, biti objavljena još jedna verzija s redoslijedom broja 3.6.3, što ispravlja kritičnu ranjivost u sustavu kernel.

Dana 25. listopada, Joomla sigurnosni štrajkački tim pronalazi posljednji problem koji je dio koda otkrio Damis. Zatim u glavnoj grani službenog repozitorija Joomla, počinjenje 21. listopada, s neprimjetnim imenom priprema 3.6.4 stabilno oslobađanje, koji popravlja zloslutnu bubu.

Nakon toga, brojni zainteresirani pojedinci povezani su s prijenosom developera na prijenos developera - počinju promicati ranjivost i kuhati krutinu.

Dana 27. listopada, Harry Roberts istraživač polaže gotove eksploatacije u Repozitorijem XIPHOS istraživanju, koji može prenijeti PHP datoteku na poslužitelj s ranjivim CMS-om.

Detalje

Pa, s prapoviješću je završeno, idite na najzanimljivije stvari - razlučivanje ranjivosti. Kao testna verzija instalirala sam Joomla 3.6.3, tako da će svi brojevi reda biti relevantni za ovu verziju. I svi putovi do datoteka koje ćete vidjeti sljedeće će biti naznačeno u odnosu na korijen instaliranog CMS-a.

Zahvaljujući pronalaženju Damis dlana, znamo da postoje dvije metode koje izvode registraciju korisnika u sustavu. Prvi koristi CMS i nalazi se u / copenents/com_users/controllers/comers/controllers/registration.php:108. Drugi (onaj koji mi moramo nazvati), živi u / komponente / com_user / kontroleri / User.php: 293. Pogledajmo bliže.

286: / ** 287: * Metoda za registraciju korisnika. 288: * 289: * @return Boolean 290: * 291: * @Since 1,6 292: * / 293: Registar javnih funkcija () 294: (295: Sad :: Kontrolni program ("Post") ili Jexit (jtek :: _ ("Jinvalid_Token")); ... 300: // dobiti obrazac podataka. 301: $ Data \u003d $ This-\u003e Input-\u003e Post-\u003e Get ("Korisnik", array (), "niz"); .. 315: $ povratak \u003d $ model-\u003e potvrditi ($ obrazac, $ podatke); 316: 317: // Provjerite pogreške. 318: Ako ($ povratak \u003d\u003d\u003d FALSE) 319: (345: / Završite registraciju. 346: $ povratak \u003d $ model-\u003e Registar ($ podaci);

Ovdje sam ostavio samo zanimljive linije. Puna verzija ranjive metode može se promatrati u spremištu Joomla.

Mi ćemo to shvatiti što se događa kada se redovito registracija korisnika: koji se podaci šalju i kako se obrađuju. Ako je registracija korisnika omogućena u postavkama, obrazac se može naći na http: //joomla.local/index.php/component/Users/? View \u003d Registracija.


Legitimni zahtjev za registraciju korisnika izgleda kao sljedeći snimka zaslona.


Komponente com_users odgovorna je za rad s korisnicima. Obratite pozornost na parametar zadataka u upitu. Ima $ kontrolora. $ Metoda. Pogledajmo strukturu datoteke.

Imena skripta u mapi kontroleri. U skladu je s imenima nazivanih kontrolora. Budući da je u našem zahtjevu sada $ kontroler \u003d "Registracija", datoteka će nazvati. registracija.php. i njegovu metodu registra ().

Pažnja, pitanje: Kako prenositi obradu registracije u ranjivom području u kodu? Vjerojatno ste već pogodili. Imena ranjivih i sadašnjih metoda podudaraju se (registrirajte), tako da možemo samo promijeniti ime nazivanog kontrolera. I gdje je ranjivi kontroler? Upravo u datoteci user.php., Ispada $ Controller \u003d "Korisnik". Prikupljamo sve zajedno i dobivamo zadatak \u003d korisnik.Register. Sada se zahtjev za registraciju obrađuje metodom koju trebamo.


Druga stvar koju trebamo učiniti je poslati podatke u pravi format. Ovdje je sve jednostavno. Legitimni registar () čeka niza od nas nazvan Jorm, u kojem prenosimo podatke u registraciju - ime, prijavu, lozinku, poštu (vidi screenshot s upitom).

  • /components/Cosers/controllers/registration.php: 124: // dobiti korisničke podatke. 125: $ zahtjevdata \u003d $ this-\u003e input-\u003e post-\u003e dobiti ("Jorform", niz (), "niz");

Naš Ward prima ove podatke iz polja koje je nazvano korisnik.

  • /componente/com_users/controllers/user.php: 301: // dobiti obrazac podataka. 302: $ Data \u003d $ This-\u003e Input-\u003e Post-\u003e Get ("Korisnik", polje (), "niz");

Stoga mijenjamo imena svih parametara s JFROM na korisniku.

Treći naš korak je pronaći CSRF važeći token, jer neće biti registracije bez njega.

  • /Components/com_users/controllers/user.php: 296: sad :: checktoken ("post") ili jexit (Jinvalid_token));

Izgleda kao hash MD5, a možete ga uzeti, na primjer, iz obrasca za autorizaciju na web -index.php/component/users/?view\u003dlogin.


Sada možete stvoriti korisnike kroz željenu metodu. Ako se sve dogodilo, čestitam - upravo ste razumjeli ranjivost CVE-2016-8870. "Nestala provjera dozvola za registraciju novih korisnika."

Evo kako izgleda kao u "radnom" metodi registra () iz korisničkog kontrolera kontrolera:

  • /componente/com_users/controllers/registration.php: 113: // Ako je registracija onemogućena - preusmjeravanje na stranicu za prijavu. 114: Ako (jcompontenthelper :: getparams ("com_users") -\u003e dobiti ("AllowusEreMistracija") \u003d\u003d 0) 115: (116: $ This-\u003e Setureditirect (jroute :: _ ("Index.php? Opcija \u003d com_users & Prikaz \u003d Prijava ", False)); 117: 118: Povratak lažno; 119 :)

I tako u ranjivom:

  • /Componente/com_users/controllers/user.php:

Da, ni na koji način.

Da bismo razumjeli drugi, mnogo ozbiljniji problem, poslat ćemo zahtjev formiran od nas i slijediti kako se izvodi na različitim dijelovima Kodeksa. Ovdje je komad koji je odgovoran za provjeru podataka koje korisnik šalje u načinu rada:

Nastavak je dostupna samo sudionicima

Opcija 1. Pridružite se web-lokaciji da pročitate sve materijale na web-lokaciji

Članstvo u zajednici tijekom određenog razdoblja otvorit će vam pristup svim materijalima hakera, povećat će vaš osobni akumulativni popust i akumulirati profesionalni Xakep ocjena!

Izradite vlastitu stranicu za registraciju za višestruke umjesto standardnog WP-Signip.php.

U uobičajenoj Wordpress Setup, stranica za registraciju (autorizacija, resetiranje lozinke) prikazuje WP-Login.php datoteku.

  • /Wp-login.php - Autorizacija
  • /wp-login.php?action\u003dregister - Registracija
  • /Wp-Login.php?action\u003dlostPassword - Poništi lozinku

Za multisite u WP-Login.php postoje zasebni uvjeti. Dakle, kada kliknete na link /w-Login.php?action\u003dregister na multisaite, Wordpress će napraviti preusmjeravanje na /Wp-signup.php stranicu. U mnogim temama, stranica ne izgleda vrlo atraktivno, pa ćemo učiniti svoje.

Glavna mreža web-mjesta

Prema zadanim postavkama, WordPress otvara stranicu za registraciju (WP-Signip.php) na mreži glavne domene (web-lokacije). Međutim, možete napraviti zasebnu stranicu za registraciju za svaku mrežnu stranicu, čak i ako imaju različite teme. Razmotrit ćemo slučaj kada na svim mrežnim web-lokacijama ima svoju stranicu za registraciju, ali se koristi ista tema i web-lokacije razlikuju samo na jeziku. Ako se koriste različite teme, morat ćete napisati više koda.

funkcije.php?

Ne. Naziv ove datoteke čini se da se spominje u bilo kojem članku o Wordpress. U našem slučaju, uzimajući u obzir činjenicu da je registracijska funkcionalnost dizajnirana za nekoliko web-mjesta, ima smisla da ga uzme u MU-dodatke koji se učitavaju prilikom otvaranja bilo koje stranice.

Lirska digresija

Važno je napomenuti da su MU-dodaci napunjeni ranije od običnih dodataka i dok se Wordpress kernel ne preuzme, tako da poziv za neke funkcije može dovesti do fatabalnih pogrešaka u PHP-u. Slični "rani" download ima svoje prednosti. Recimo unutar bilo koje temu ne mogu se držati neke akcije koje se pokreće prije preuzimanja datoteka funkcija. Primjer ovog može poslužiti kao jetpack_module_loaded_relirani-posts plugin (povezani - posts - naziv modula) s kojim je moguće pratiti aktivnost modula u jetpaku. Nemoguće je "kvadkati" iz datoteke teme na ovu radnju, jer je radnja već radila prije učitavanja tema - dodaci su učitani ranije. Možete pogledati zajedničku sliku narudžbe WordPress boot na referentnoj stranici Akcija u kodu.

Naručiti u datotekama

Mu-dodaci mogu sadržavati bilo koji broj datoteka i bilo koji grafikon, koji će vam se činiti logičnim. Pridržavam se takve hijerarhije:

| -Mu-plugins | - | load.php | - | - | Selena-mreža | - | - | - | - -igning | - | - | - | - | - | - | - | - | - | - | -... | - | - | - | -Jetpack | - | - | - | - | - -plugin.php

U datoteci Load.php, svi potrebni "dodaci" povezani su na našu mrežu:

Opterećenje traslate za sve dodatke Load_muplugin_TextDondain ("Selena_network", "/ Selena-mreža / jezici /"); // Mrežna prijava zahtijevaju wpmu_plugin_dir. "/selena-network/signup/plugin.php"; // Još jedan dodatak // zahtijevaju wpmu_plugin_dir ...

Unutar mape Selena-Network, plug-in mape se pohranjuju, svaka ima svoj vlastiti plugin.php, koji se povezujemo na Load.php. To daje fleksibilnost i sposobnost brzog onemogućavanja i uključivanja nekih stvari.

Adresa stranice za registraciju

Da biste odredili adresu stranice za registraciju, koristite WP_SIGNUP_Location filtra. Može se naći unutar WP-Login.php datoteku i ona je onaj koji je odgovoran za preusmjeravanje na wp-prijavu.php.

Slučaj "Registrirajte se": ako (IS_MULTISITE ()) (WP_REDIRECT (Apply_filters ("WP_signup_Location", Network_Site_url ("WP-Signip.php"))); izlaz;

Dodajte svoju značajku u MU-Plugins / Selena-Network / Prijava / Plugin.php, koji će dati adresu registracije na trenutnoj web-lokaciji:

Funkcija Selena_Network_signup_page ($ URL) (povrat kući_url (). "/ Prijavite /"

selena_network - prefiks, koji koristim u imenima svih funkcija unutar Mu-dodataka na mojoj web-lokaciji kako bi se izbjegli sukobi, treba zamijeniti svojim jedinstvenim prefiksom. Prioritet dodavanja filtra 99, jer neki dodaci, kao što je Bbpress i BuddyPress, mogu prebrisati ovu adresu na vlastite (Mu-dodatke su učitani ranije od konvencionalnih dodataka, vidi gore). Imajte na umu da se kućni_url () koristi, umjesto mreže_site_url (), ostaviti posjetitelja na istoj domeni. Možete koristiti bilo koji URL kao adresu.

Stvaranje stranice

Sada ćemo stvoriti stranicu sa site.com/signup/ preko redovitog sučelja iu predloškom mape za kćer-subjektu za našu novu stranicu - stranica-Signip.php. Umjesto riječi "Prijava" možete koristiti jedinstveni ID.

Unutar novog predloška, \u200b\u200bmorate nazvati funkciju Selena_Network_Main_main (), koji će prikazati obrazac za registraciju.

Važno je napomenuti da cijeli proces s predlošcima nije potreban i umjesto toga možete stvoriti vlastiti kratki kod, koji će također nazvati funkciju selena_network_main_main ().

wP-Signip.php i WP-Activate.php

Sada ćemo stvoriti funkciju koja će prikazati obrazac za registraciju. Da biste to učinili, kopirajte datoteke WP-prijavu .php i WP-Activate.php iz korijena WordPress u MU-Claphings / Selena-Network / Prijava / (i ne zaboravite ih spojiti u Mu-dodaci / Selena-Network / Prijavite se / plugin.php). Daljnje manipulacije s datotekama izuzetno su teške i dugo za opisivanje, pa ih dođite da ih napravite sami. Opisat ću samo što točno treba učiniti i objaviti izvorne datoteke vašeg projekta:

  1. Na početku datoteke, izbrišite sve potrebne funkcije poziva i drugi kod vanjskih funkcija.
  2. Preimenujte sve funkcije dodavanjem jedinstvenih prefiksa na imena.
  3. Donji dio WP-Signip.php koda je omotan u funkciju Selena_Network_Main_main iu samom početku pisati globalne $ Active_signup; ,
  4. Zamijenite raspored sami na pravim mjestima.

Unutar WP-ACTIVATE.PHP trebate učiniti oko istog:

  1. Izbrišite sve funkcije vanjske strane, omotajte izgled u zasebnu funkciju.
  2. Promijenite raspored na mjestima gdje je potrebno.

WP-Activate.php datoteka odgovorna je za stranicu aktivacije računa. Kao i kod stranice za registraciju, morate stvoriti zasebni predložak koji želite pozvati funkciju iz WP-Activate.php datoteke.

Poslali smo aktivacijska slova

Stranica za registraciju šalje pismo posjetitelju s obzirom na aktivaciju računa. Prema zadanim postavkama, to je funkcija WPMU_SIGNUP_User_Notification () iz datoteke MS-Funkcije.php. Njegova funkcionalnost može se posuditi za njegovu funkciju. Razlog zašto želite odbiti koristiti ovu funkciju - šalje referencu za aktivaciju računa s WP-Activate.php. Možete onemogućiti ovu značajku pomoću filtra WPMU_signup_user_notification pomicanjem lažnim na njemu (ako to ne znači, aktivacijski slovo će biti poslano dvaput, u redu, u stvari dva različita slova).

Funkcija ArmyOFselenagomez_wmu_signup_user_notification ($ korisnik, $ User_mail, $ ); Povratak false;) add_filter ("wpmu_signup_user_notification", "armplofselegenagomez_wmu_signup_user_notification", 10, 4);

Kao rezultat toga, stranica za registraciju u temi Selene počela je izgledati mnogo čišći i oprezni.

Zaključak

Internet ima mnogo drugih ne vrlo ispravnih načina da se ista stvar - Apache preusmjerava, ajax-oblici koji neće raditi bez Java skripte, itd. Stvarno mi se sviđalo, pa sam pokušao to učiniti najrespirentno moje vlastite web stranice.

Napomim da bi datoteke uređivanja trebale biti u mogućnosti da se pažljivo i pokušaju ne smijati od izvora do rančanog rančanja, ako WordPress mijenja WP-Signip.php i WP-Activate.php datoteke, one su ih lakše usporediti kako bi pronašli promjene ,

Ne zaboravite pogledati izvorni kod svih gore opisanih funkcija kako biste se u potpunosti bavili što i kako se to događa unutar koda.

Bonus. Zaštita od Spamera

Čak i najmlađih mjesta na Wordpresiju često su podložne registraciji neželjene pošte. Možete pisati beskrajne uvjete za filtriranje robota, često više slični pokušaju stvaranja umjetne inteligencije Acitvate.php, tražio sam da izdam 404 (nisam stručnjak za postavljanje Apache, tako da moja pravila ne mogu biti vrlo ispravna).

RewriteEngine na RewriteBase / Rewrirule ^ WP-SignUp \\ .php - Rewriterirule ^ WP-Aktivirajte \\ _pp - # Počinje Wordpress # Pravila iz WordPress prema zadanim postavkama ne dodirujte :) # #

P. S. Pokušavam opisati neke stvari treće strane, kao što je detaljno što je više moguće, jer kad sam počeo, ponekad je nekako bilo reći i objasniti mnoge stvari. Također vjerujem da će slični mali savjeti o drugim materijalima netko biti gurnut na proučavanje nečeg novog i šireći svoje područje znanja. Redoviti izrazi koriste se u rekreditografiji, oni nisu potpuno složeni, na primjer, simbol ^ znači početak linije.

Registrira funkciju koja će se aktivirati tijekom aktivacije dodatka.

Ova značajka pridaje određenu funkciju povratnog poziva. aktiviranje_ (plugin) I omot za ovu kuku.

(Plugin) u kuku Aktiviranje_ (plugin) zamijenjen je imenom relativnog dopušta glavnom dodatku. Na primjer, ako se nalazi dodatak: WP-sadržaj / plugins / uzorakpplugin / uzorak.php, tada će naziv kuke biti: Aktiviranje_sampleplugin / uzorak.php.

Iz verzije 3.1. Kuka se aktivira samo tijekom aktivacije dodatka i ne radi tijekom automatskog ažuriranja dodatka.

Kako radi

Dodatak se aktivira funkcijom aktiviranje_plugin () u kojoj se aktivira kuka za kuku (plugin).

Aktiviranje_plugin () funkcija u kernelu je uzrokovana nakon učitavanje srednjeg VP , Ova funkcija povezuje master plug-in datoteku (i sve što je navedeno u njemu), a zatim kroz kuku aktivira određenu funkciju povratnog poziva. Zbog toga su sve funkcije i klase plug-in dostupne u našoj funkciji povrata. No, budući da su sve glavne kuke WP već radili tijekom srednjeg čizma, onda se ne mogu objesiti nikakve dodatke na kukama, na primjer plugins_loaded, više ne rade prilikom spajanja glavne datoteke utikača. Dakle, naš dodatak će biti povezan, ali ne potpuno: ne kao što bi se trebao povezati kada je već aktiviran.

Na primjer, ako dodatak čini nešto tijekom događaja plugins_loaded, onda se sve te radnje jednostavno neće dogoditi kada je aktivacija plug-in. Na primjer, ako spaja prijevod datoteku, datoteka prijevoda neće biti spojen u trenutku pokretanja funkcije povratnog poziva navedenog za registraciju_aktivacija_Hook ().

U pravilu, nakon što se aktivira funkcija povratnog poziva, postoje 2 događanja za objesiti funkcije: aktivirani_plugin i gašenje.

Da biste učinili nešto izvanredno kada je dodatak aktiviran, vidi primjer 5.

Uvjeti korištenja

Funkcija neće raditi ako ga nazovete u vrijeme kuke, na primjer, plugins_loaded, init. Funkcija se mora nazvati izravno iz glavne datoteke plug-in. Pravila o aktivaciji:

    registrirajte se_aktivacija_hook () trebaju biti pozvani iz master dodatke datoteke, odakle se nalazi Direktiva o nazivu dodatka: ... i ne smije se zvati s bilo koje kuke, poput plugins_loaded ili init.

    Funkcija kuke bi trebala biti u istoj datoteci kao kuka ili se unaprijed spojite iz druge datoteke.

    Funkcija kuke ne radi na zaslonu (echo). Jer se preusmjerava i odjeka odvija. Ali možete koristiti umrijeti ().

  1. Globalne varijable (ako ih ima) moraju se izričito odrediti za pristup funkciji kuke.

Napomene o području varijabli

Prilikom aktiviranja dodatka, glavna dodatka datoteka nije spojena u globalnom području, već unutar funkcije Activate_plugin (). Stoga, varijable koje se smatraju globalnim u uobičajenom načinu rada dodatka.

Dakle, funkcija koja se koristi u registru_aktivacija_hook () ne može vidjeti globalne varijable, čak i ako ste ih proglasili kao globalne unutar ove funkcije. Primjer:

$ Myvar \u003d "nešto"; Registracija_aktivacija_hook (__ datoteka__, "myplugin_activate"); Funkcija myplugin_aktivnog () (globalni $ Myvar; echo $ myvar; // varijabla nije jednaka "nešto")

Zbog ove značajke uvijek trebaju biti navedene globalne varijable. Sve globalne varijable moraju se definirati kao globalni, čak i ako je varijabla označena u tijelu plug-in. Samo u ovom slučaju bit će im pristup bilo gdje. Primjer:

Globalni $ myvar; // jasno ukazuju na to da je ovo globalna varijabla $ myvar \u003d "nešto"; Registracija_aktivacija_hook (__ datoteka__, "myplugin_activate"); Funkcija myplugin_aktivnog () (globalni $ Myvar; echo $ myvar; //\u003e nešto)

Nema kuka.

Povratak

null. Ništa se ne vraća.

Upotreba

Registrirajte_aktivacija_hook ($ datoteka, $ funkcija); $ datoteku. (niz) (obavezno) Put do glavnog PHP plugin datoteke uključujući ime samog dodatka. Obično se koristi čarobna konstantna php __file__. $ Funkcija. (linija / niz / lambda) (obavezno)

Naziv funkcije povratnog poziva. Za nastavu koristite niz: polja ($ ovo ", naziv funkcije"); ,

Funkcija će dobiti logičku varijablu $ Network_wide - je li dodatak aktiviran za cijelu mrežu web-lokacija, uz multisait.

Primjeri

#jedan. Pokretanje funkcije prilikom aktiviranja dodatka

Pretpostavljamo da imamo funkciju My_plugin_activate () u glavnom dodatku: WP-sadržaj / plugins / myplugin / myplugin.php, zatim pokrenuti ovu funkciju tijekom aktivacije dodatka, koristite takav kod:

Registracija_aktivacija_hook (__ datoteka__, "my_plugin_active"); Funkcija my_plugin_activate () (// aktivacijski kod ...)

# 2. Pokretanje metode klase

Ako plugin koristi PHP razred, aktivacijski kôd se dodaje kao:

Registracija_aktivacija_hook (__ datoteka__, niz ("my_plugin", "instalirati")); Klasa My_plugin (statička funkcija Instalacija () (// Ne stvarajte bilo koji izlaz ovdje ...)

# 3. Pokrenite metodu razreda iz zasebne datoteke

Ako je klasa koja sadrži funkciju aktivacije u zasebnoj datoteci, zatim registrirajte funkciju aktivacije na sljedeći način:

Uključuju_once __dir__. "/class-My_plugin.php"; Registracija_aktivacija_hook (__ datoteka__, niz ("my_plugin", "on_activate_funkcija");

#four. Pokrenite razred razred iz razreda

Ako ste unutar __Construct (). Važno, __File__ trebaju "izgledati" na glavni dodatak:

Registracija_aktivacija_hook (__ datoteka__, niz ($ ovo, "your_method_name");

# 5 Napravite nešto odmah nakon aktivacije dodatka

Nakon aktiviranja dodatka, aktiviraju se samo dvije kuke: aktiviran_plugin i gašenje.

Kada trebate učiniti ništa odmah nakon aktiviranja dodatka, možete im priključiti funkciju.

Kada ovo rješenje nije prikladno, možete koristiti WP opcije: Spremite podatke na opciju, a zatim provjerite dostupnost opcije i učinite nešto ako je opcija:

// glavni plug-in datoteku. ... Funkcija my_plugin_activate () (// Dodaj opciju da tada ako je to učiniti bilo što. Add_option ("Actived_plugin", "Plugin-Slug"); // ovdje aktivacijski kod ...) Registriranje_aktivacija_hook (__ File__, " my_plugin_activate "); Funkcija Load_plugin () (ako (IS_admin () && get_option ("Actived_plugin") \u003d\u003d "Plugin-Slug") (// Uklonite dodanu opciju tako da više ne radi // i učinite ono što vam je potrebno ... Izbrisati_option ("Actived_plugin"); // napravite nešto jednom, nakon aktiviranja dodatka // na primjer: add_action ("init", "my_init_funkcija");))) add_action ("admin_init", "load_plugin");

Još jedna mogućnost da učinite nešto tijekom aktivacije dodatka je stvoriti svoj vlastiti događaj kao što je ovaj:

Funkcija my_plugin_activate () (// instalirajte kuku tako da možete ići na njega iz do_action plugin ("my_plugin_active");) Registriration_Activation_hook (__ File__, "My_plugin_active");

# 6 Još jedna demonstracija korištenja funkcije

Mali dodatak koji pokazuje kako koristiti funkciju:

/ * Plugin naziv: test opis: test * / potreban_once dirname (__ datoteka__). "/my_Othere_File.php"; / * Ovaj kod neće raditi. Kuka za aktivaciju trebala bi biti pozvana iz glavne datoteke. Registracija_aktivacija_hook (DirName (__ File__). "/My_Othere_File.php", "My_Other_funkcija"); * / // Ovo je radni kod. Registracija_aktivacija_hook (__ datoteka__, "test_activived"); / * Ovo je ispravna opcija najava i pristup globalnim varijablama. Globalne varijable treba jasno proglasiti. Bez toga nećete imati pristup njima. * / Global $ nee_var; $ nea_var \u003d "hej"; // Funkcija test_aktivirana () (// ovdje $ nee_var neće biti Hey Global $ nee_var; // i ovdje $ nee_var će biti hej jednako // ova funkcija je definirana u datoteci "my_Other_File.php" "My_Other_function (); * Opcija neće raditi. Ako trebate snimati dnevnike u privremenu datoteku, koristite Fopen / FWRITE. Ako želite provjeriti je li kuka aktivacije funkcionira, koristite izlaz () unutar funkcije kuke. * / Echo "Test_activirani pod nazivom ! ";)