Cum de a crea propria pagină de înregistrare în WordPress Multisite. Cum de a crea propria pagină de înregistrare în bonusul multisite WordPress. Protecție împotriva spam-urilor

Link-urile de unică folosință pot fi utilizate într-o varietate de situații: pentru a oferi acces temporar la fișier sau pagină sau pentru a confirma înregistrarea. În această lecție, vom arăta cum să generăm și să implementăm adrese URL de unică folosință.

Crearea URL-URL.

Să presupunem că site-ul nostru are un sistem de autentificare a utilizatorului. După înregistrare, solicităm utilizatorului să transmită procedura de verificare prin e-mail. Pentru a crea astfel de link-uri, putem folosi parametrul Special Token. Un exemplu de astfel de link:

Http: //example.com/activa? Token \u003d EE97780 ...

Fără o bază de date, nu putem face aici, așa că să ne uităm la masă cu care vom lucra.

Creați tabelul în așteptare_Users (Token Char (40) Nu NULL, Nume utilizator Varchar (45) Nu NULL, TSTAMP Integer nesemnat Nu Null, Cheie primară (jeton);

În tabel vom stoca 3 domenii: token, nume de utilizator și timp. Pentru a genera un simbol, vom folosi funcția SHA1 (), care oferă un șir de 40 de caractere. Câmpul TSTAMP va stoca timpul de generare a tokenului, astfel încât să putem urmări legăturile cu un exterior.

Există multe modalități de a genera un simbol, dar în această lecție vom folosi funcții UNIQD () și SHA1 (). Indiferent de metoda de generare a unui simbol, asigurați-vă că valorile generate vor fi diferite și probabilitatea de duplicare este minimă.

$ token \u003d SHA1 (UNIQD ($ username, true));

Ca parametru, funcția UNIQD () ia șirul, iar ieșirea oferă un identificator unic bazat pe argumentul transmis și ora curentă. De asemenea, ca un al doilea argument, această funcție primește o valoare booleană care va da semnalului UNIQD să adauge mai multe caractere suplimentare pentru a crește probabilitatea de valoare unică. Caracteristica SHA1 ia un identificator unic și creează o hash.

După ce ați lucrat la două funcții, vom avea un semn unic care să poată utiliza pentru a genera adrese URL. Acum trebuie să o punem în baza de date:

$ Query \u003d $ db-\u003e Pregătiți ("inserați în așteptare_users (numele de utilizator, token, tstamp) (?,?)"); $ Query-\u003e Execute (matrice ($ username, $ token, $ _Server ["solicitare_time"]));

Pentru ca noi să știm ce utilizator ar trebui să fie activat, vom înregistra și vă vom conecta la masă. Într-un exemplu, mai adaptat pentru un site real, puteți utiliza ID-ul de utilizator.

Acum că avem toate informațiile necesare, putem crea o adresă URL temporară:

$ url \u003d "http://example.com/activate.php?tken\u003dpToken";

$ Message \u003d.<<

Verifica

Acum avem nevoie de un script, datorită căruia vom verifica. Tot ce trebuie să facem este să comparați jetonul de la adresa URL și token de la bază. Dacă există un astfel de lucru, și timpul vieții sale nu a expirat, atunci totul este în regulă.

// Get Ifken (Isset ($ _ obține ["token"]) && preg_match ("/ ^ (40) $ / i", $ _get ["token"]) ($ token \u003d $ _get ["jeton" ];) Altceva (aruncă o excepție nouă ("Tockenul nu este valid"););) // verificarea $ query \u003d $ db-\u003e pregătiți token ("selectați numele de utilizator, tstamp de la penduit_users unde token \u003d? $ Query-\u003e Execute (matrice ($ token)); $ Row \u003d $ query-\u003e Fetch (DOP :: Fetch_assoc); $ Query-\u003e closecuster (); dacă ($ rând) (extras ($ rând);) altceva (aruncă o excepție nouă ("Tocken nu este valid");) // Activați contul de utilizator // ... // Scoateți jetonul de la interogarea de bază \u003d $ Db\u003e Pregătiți ("Ștergere de la penduit_users unde numele de utilizator \u003d? Și token \u003d? Și tstamp \u003d?",); $ Query-\u003e Execute (matrice ($ username, $ token, $ tstamp));

De asemenea, trebuie să oferim testarea jetoanelor, a căror viață a expirat:

// 1 zi în secunde \u003d 60 secunde * 60 de minute * 24 ore $ Delta \u003d 86400; // Verificați dacă ($ _Server ["solicitare_time"] - $ tstamp\u003e $ Delta) (aruncați o excepție nouă ("durata de viață a Tocken a expirat");) // Activați contul personalizat // ...

Astfel, vom avea două verificări: una cu privire la validitatea tokenului, cealaltă la momentul existenței sale.

Rezultat

Această metodă poate fi aplicată nu numai pentru a activa conturile de utilizator, ci și în alte nevoi: de exemplu, pentru a oferi acces unic sau temporar la o resursă sau serviciu.

În plus față de toate acestea, puteți crea un script care va elimina jetoanele care nu au folosit niciodată. Acest script poate fi lansat din când în când sau aplicați pentru acest cron.

Segal Vom lua în considerare exploatarea vulnerabilității critice de 1 zi în populară CMS Joomla, care a tunelat pe internet la sfârșitul lunii octombrie. Va fi vorba despre vulnerabilități cu numere CVE-2016-8869., CVE-2016-8870. și CVE-2016-9081.. Toate cele trei apar de la o bucată de cod, care a fost o dată în adâncurile cadrului, așteptând propriile ore, apoi să se elibereze și să aducă haosul, site-uri hacked și lacrimi în orice utilizator nevinovat din acest Joomla. Doar dezvoltatorii cei mai viteji și îndrăzneți ale căror ochi sunt roșii din lumina monitoarelor, iar tastaturile sunt pline de pâine, au fost capabili să provoace sufziunea umflată și să-și impună capul pe altarul de fixare.

Avertizare

Toate informațiile sunt furnizate exclusiv în scopuri informative. Nici editorii, nici autorul nu sunt responsabili pentru niciunul rău cauzat de materialele acestui articol.

De ce a început totul

La 6 octombrie 2016, Damis Palma (Demis Palma) a creat un subiect despre schimbul de stivuire, care a întrebat: De ce, de fapt, în Joomla versiunea 3.6 există două metode pentru înregistrarea utilizatorilor cu același registru de nume ()? Primul este situat în controlerul de monitorizare a utilizatorilor, iar al doilea este în UserScontrolleruser. Damis a vrut să știe dacă UserScontrolleruser :: Register () Metoda este utilizată undeva sau este doar un anacronism evolutiv care rămâne de la vechea logică. El a fost deranjat de faptul că, chiar dacă această metodă nu este utilizată în nici o prezentare, aceasta poate fi numită utilizând o cerere formată. Care a fost răspunsul de la dezvoltator sub porecla lui Itoctopus, confirmând: problema există într-adevăr. Și a trimis un raport către dezvoltatorii Joomla.

Apoi, evenimentele au dezvoltat cea mai rapidă cale. La 18 octombrie, dezvoltatorii Joomla acceptă raportul Damis, care până la acel moment poc, permițându-vă să înregistrați utilizatorul. A publicat o notă pe site-ul său, unde, în termeni generali, despre problema și gândurile despre acest lucru. În aceeași zi, noua versiune a lui Joomla 3.6.3 iese, care conține încă un cod vulnerabil.

După aceasta, David Tampelli (Davide Tampellini) se rotește cu bug-ul la starea de înregistrare nu este un utilizator simplu, ci administrator. Și pe 21 octombrie, echipa de securitate Joomla sosește un nou caz. Vorbește deja despre atragerile de privilegii. În aceeași zi, anunțul apare pe site-ul Joomla care, marți, 25 octombrie, o altă versiune cu un număr de secvență 3.6.3 va fi lansată, ceea ce corectează vulnerabilitatea critică în kernelul sistemului.

La 25 octombrie, echipa Joomla Security Strike găsește ultima problemă că o bucată de cod descoperit de Damis. Apoi, la filiala principală a depozitului oficial Joomla, comiterea din 21 octombrie, cu un nume inconspicuos pregătește 3,6.4 lansare stabilă, care stabilește bug-ul rău.

După aceea, numeroase persoane interesate sunt legate de transmiterea dezvoltatorilor la transmiterea dezvoltatorilor - încep să promoveze vulnerabilitatea și să gătească solidul.

La 27 octombrie, cercetătorul Harry Roberts stabilește un exploatat gata în Repositoria de Cercetare Xiphos, care poate încărca un fișier PHP la un server cu o CMS vulnerabilă.

Detalii

Ei bine, cu preistoria este terminată, du-te la cel mai interesant lucru - discernământul vulnerabilității. Ca versiune de testare, am instalat Joomla 3.6.3, astfel încât toate numerele de rând vor fi relevante pentru această versiune. Și toate căile către fișierele pe care le veți vedea în continuare vor fi indicate în raport cu rădăcina CMS instalată.

Datorită Găsiți palma Damis, știm că există două metode care efectuează înregistrarea utilizatorului în sistem. Primul este folosit de CMS și este în /Components/com_users/controllers/comers/controllers/registration.php:108. Al doilea (cel pe care noi și va trebui să-l apelați), trăiește în / componente / com_Users / controlere / user.php: 293. Să ne uităm mai aproape.

286: / ** 287: * Metoda de înregistrare a unui utilizator. 288: * 289: * @return Boolean 290: * 291: * @since 1.6 292: * / 293: Registrul funcțiilor publice () 294: (295: JSession :: KeckToken ("Post") sau Jexit (Jtext :: _ ("Jinvalid_token")); ... 300: // Obțineți datele formularului. 301: $ date \u003d $ acest-\u003e intrare-\u003e post-\u003e obține ("utilizator", matrice (), "matrice");. . 315: $ return \u003d $ model-\u003e validate ($ formular, $ date); 316: 317: // Verificați erorile. 318: Dacă ($ retur \u003d\u003d\u003d fals) 319: (... 345: / Finalizați înregistrarea. 346: $ retur \u003d $ model-\u003e înregistrare ($ date);

Aici am lăsat doar linii interesante. Versiunea completă a metodei vulnerabile poate fi văzută în depozitul Joomla.

Ne vom da seama ce se întâmplă atunci când înregistrarea obișnuită a utilizatorului: Ce date sunt trimise și cum sunt procesate. Dacă înregistrarea utilizatorului este activată în setări, formularul poate fi găsit la http: //joomla.local/index.php/component/users/? Vizualizare \u003d Înregistrare.


O solicitare legitimă de înregistrare a utilizatorilor arată ca următoarea screenshot.


Componentele COM_USERS sunt responsabile pentru lucrul cu utilizatorii. Acordați atenție parametrului sarcinii din interogare. Are controler $. Metoda $. Să ne uităm la structura fișierului.

Numele scriptului în dosar controlere. Respectă numele controlorilor numiți. Deoarece în cererea noastră este acum $ controller \u003d "înregistrare", fișierul va apela. Înregistrare.php. Și metoda registrului său ().

Atenție, Întrebare: Cum să transmiteți procesarea înregistrării într-o zonă vulnerabilă din cod? Probabil ați ghicit deja. Numele metodelor vulnerabile și prezente coincid (înregistrați), astfel încât să putem schimba numele controlerului numit. Și unde este controlerul vulnerabil? Chiar în dosar user.php.. Se oprește $ controller \u003d "utilizator". Noi colectăm toate împreună și obținem sarcini \u003d user.register. Acum, cererea de înregistrare este procesată de metoda de care avem nevoie.


Al doilea lucru pe care trebuie să-l facem este să trimitem date în formatul potrivit. Totul este simplu aici. Registrul legitim () așteaptă o matrice de la noi numită Jorm, în care transmitem date pentru înregistrare - nume, conectare, parolă, poștă (a se vedea screenshot cu o interogare).

  • /Componentens/com_users/controllers/registration.php: 124: // Obțineți datele utilizatorului. 125: $ Cereredata \u003d $ Acest-\u003e intrare-\u003e post-\u003e obține ("jform", matrice (), "matrice");

Ward-ul nostru primește aceste date din matricea numită utilizator.

  • /Components/com_users/controllers/user.php: 301: // Obțineți datele formularului. 302: $ DATA \u003d $ Acest-\u003e intrare-\u003e post-\u003e obține ("utilizator", matrice (), "matrice");

Prin urmare, schimbăm numele tuturor parametrilor cu JFROM pe utilizator.

Al treilea pasul nostru este de a găsi un token valid CSRF, deoarece nu va exista nici o înregistrare fără ea.

  • /Components/com_users/controllers/user.php: 296: JSession :: KeckToken ("Post") sau Jexit (Jinvalid_Token));

Arată ca un hash MD5 și o puteți lua, de exemplu, de la formularul de autorizare de pe site /index.php/component/users/?view\u003dlogin.


Acum puteți crea utilizatori prin metoda dorită. Dacă sa întâmplat totul, mă felicit - tocmai ați înțeles vulnerabilitatea CVE-2016-8870. "Verificarea lipsă a permiselor de înregistrare a noilor utilizatori".

Iată cum arată în metoda "de lucru" a registrului () de la controlerul de utilizatoriControllerRegistration:

  • /Components/com_users/controllers/registration.php: 113: // Dacă înregistrarea este dezactivată - redirecționați la pagina de conectare. 114: Dacă (JComponentHelper :: GetParams ("com_Users") -\u003e Obțineți ("AllowuseRregistration") \u003d\u003d 0) 115: (116: $ this-\u003e Setredirect (JROUTE :: (index.php? Option \u003d com_Users & View \u003d Login ", Fals)); 117: 118: Întoarceți false; 119 :)

Și astfel în vulnerabilă:

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

Da, în nici un caz.

Pentru a înțelege cea de-a doua problemă mult mai gravă, vom trimite o cerere formată de noi și vom urma cum se efectuează pe diferite secțiuni ale codului. Iată o piesă responsabilă pentru verificarea datelor trimise de utilizator în metoda de lucru:

Continuarea disponibilă numai participanților

Opțiunea 1. Alăturați-vă comunității site-ului pentru a citi toate materialele de pe site

Apartenența în comunitate În perioada specificată vă va deschide accesul la toate materialele Hacker, vă va mări reducerea cu acumularea personală și va acumula un rating profesionist XAKEP!

Creați propria pagină de înregistrare pentru multisite în loc de standard WP-Signup.php.

În setarea obișnuită WordPress, pagina de înregistrare (autorizația, resetarea parolei) afișează fișierul WP-Login.php.

  • /wp-login.php - Autorizare
  • /wp-login.php?action\u003dregister - Înregistrare
  • /wp-login.php?action\u003dLostPassWord - Resetarea parolei

Pentru multisite în WP-Login.Php există condiții separate. Deci, atunci când faceți clic pe linkul /wp-login.php?action\u003dRegister pe Multisaite, WordPress va face o redirecționare a paginii /wp-signup.php. În multe subiecte, pagina nu pare foarte atractivă, așa că vom face propriul nostru.

Rețeaua principală de site-uri web

Implicit, WordPress deschide pagina de înregistrare (WP-Signup.php) pe rețeaua principală (site-ul web). Cu toate acestea, puteți efectua o pagină de înregistrare separată pentru fiecare site de rețea, chiar dacă au subiecte diferite. Vom lua în considerare cazul în cazul în care toate site-urile de rețea au propria pagină de înregistrare, dar același subiect este utilizat și site-urile diferă numai în limba. Dacă se utilizează diferite subiecte, va trebui să scrieți mai mult cod.

funcții.php?

Nu. Numele acestui fișier pare să fie menționat în orice articol despre WordPress. În cazul nostru, luând în considerare faptul că funcționalitatea înregistrării este concepută pentru mai multe site-uri, este logic să o luați în mu-pluginurile care sunt încărcate la deschiderea oricărui site.

Digresiune lirică

Este demn de remarcat faptul că Mu-plugin-urile sunt încărcate mai devreme decât plug-in-urile obișnuite și până când kernelul WordPress este complet descărcat, astfel încât apelul pentru unele funcții poate duce la erori fatabale în PHP. Descărcarea similară "devreme" are avantajele sale. Să spunem în interiorul oricărei tematici nu se poate agăța de o acțiune care este declanșată înainte de a descărca funcțiile.php fișierul din subiect. Un exemplu de acest lucru poate servi ca un plugin jetpack_module_loadd_relat-stâlp (mesaje asociate - numele modulului) cu care este posibil să urmăriți activitatea modulelor din JetPack. Este imposibil de "ambreiaj" din dosarul de subiect la această acțiune, deoarece acțiunea a lucrat deja înainte de încărcare a subiectului - pluginurile sunt încărcate mai devreme. Puteți să aruncați o privire la imaginea comună a comenzii de boot WordPress pe pagina de referință a acțiunii din cod.

Comandați în fișiere

Mu-Plugins poate conține orice număr de fișiere și orice diagramă, care va părea logică pentru dvs. Eu aderă la o astfel de ierarhie:

| -Mu-plugin-uri | - | load.php | - | - | Selena-Network | - | - | - | - - | - | - | - | - | - | -... | - | - | - | -jetpack | - | - | - | - | - |

În fișierul load.php, toate "pluginurile" necesare sunt conectate la rețeaua noastră:

Încărcați traseele pentru toate Addons Load_Muplugin_textdomain ("Selena_network", "/ Selena-Rețea / Limbi /"); // Înscrierea în rețea necesită wpmu_plugin_dir. "/sena-network/signup/plugin.php"; // un alt plugin // necesită wpmu_plugin_dir ...

În interiorul dosarului de rețea Selena, sunt stocate foldere plug-in, fiecare are propriul plugin.php, pe care îl conectăm la încărcare.php. Oferă flexibilitate și abilitatea de a dezactiva rapid și de a include unele lucruri.

Adresa paginii de înregistrare

Pentru a specifica adresa paginii de înregistrare, utilizați filtrul WP_SIGNUP_LOCACACE. Acesta poate fi găsit în interiorul fișierului WP-Login.php și este cel care este responsabil pentru redirecționarea pe WP-Signup.php.

Cauza "Registru": dacă (is_multisită () () () () () (wp_signup_locație ", rețea_site_url (" wp-signup.php ")); Ieșire;

Adăugați caracteristica dvs. în Mu-Plugins / Selena-Network / Signup / Plugin.php, care va oferi adresa paginii de înregistrare pe site-ul curent:

Funcție SELENA_NETWORK_SIGNUP_PAGE ($ URL) (return Home_url (). "/ Înscriere /";) add_filter ("wp_signup_locație", "selena_network_signup_page", 99);

selena_Network - Prefix, pe care îl folosesc în numele tuturor funcțiilor din Mu-Plugin-uri de pe site-ul meu pentru a evita conflictele, ar trebui înlocuite cu propriul prefix unic. Prioritatea adăugării filtrului 99, deoarece unele pluginuri, cum ar fi BBPress și Buddypress, pot suprascrie această adresă (Mu-plugin-urile sunt încărcate mai devreme decât pluginurile convenționale, vezi mai sus). Vă rugăm să rețineți că Home_url () este utilizat, în loc de rețea_site_url (), pentru a părăsi vizitatorul în același domeniu. Puteți utiliza orice adresă URL ca o adresă.

Crearea unei pagini

Acum, să creăm o pagină cu site.com/signup/ printr-o interfață obișnuită, iar în șablonul de dosare a fiicei noastre pentru noua noastră pagină - pagina-Signup.php. În loc de cuvântul "Înscriere", puteți utiliza un ID unic.

În interiorul noului șablon, trebuie să apelați funcția SELENA_NETWORK_SIGNUP_MAIN (), care va afișa formularul de înregistrare.

Este demn de remarcat faptul că întregul proces cu șabloane nu este necesar și, în schimb, puteți crea propriul cod scurt, care va apela și funcția SELENA_NETWORK_SIGNUP_MAIN ().

wp-signup.php și wp-activate.php

Acum vom crea o funcție care va afișa formularul de înregistrare. Pentru a face acest lucru, copiați fișierele WP-SIGUP.PHP și WP-Activate.Php de la WordPress Root în MU-Plugings / Selena-Network / Signup / (și nu uitați să le conectați în interiorul Mu-Plugins / Selena-Rețea / Signup / Plugin.php). Mai multe manipulări cu fișiere sunt extrem de dificile și lungi pentru a descrie, așa că veniți să le faceți singur. Voi descrie doar ce trebuie să fie făcut și să publicați fișierele sursă ale proiectului dvs.:

  1. La începutul fișierului, ștergeți toate necesitățile, funcțiile de apel și alte funcții din afara codului.
  2. Redenumiți toate funcțiile adăugând prefixe unice la nume.
  3. Partea de jos a codului WP-Signup.php este înfășurată în funcția Selena_Network_signup_main și la începutul său pentru a scrie Global $ Active_Signup; .
  4. Înlocuiți aspectul pe cont propriu în locurile potrivite.

În interiorul WP-Activate.Php trebuie să faceți același lucru:

  1. Ștergeți toate funcțiile de cod extern, înfășurați aspectul într-o funcție separată.
  2. Schimbați aspectul în locurile în care este necesar.

Fișierul WP-Activate.php este responsabil pentru pagina de activare a contului. Ca și în cazul paginii de înregistrare, trebuie să creați un șablon separat în interiorul care să apelați o funcție din fișierul WP-Activate.php.

Trimitem scrisorile de activare

Pagina de înregistrare trimite o scrisoare vizitatorului cu referire la activarea contului. În mod implicit, aceasta este funcția WPMU_SIGNUP_USER_NOTIFICATION () din fișierul ms-funcții.php. Funcționalitatea sa poate fi împrumutată pentru funcția sa. Motivul pentru care doriți să refuzați să utilizați această funcție - trimite o referință de activare a contului cu WP-Activate.Php. Puteți dezactiva această caracteristică utilizând filtrul WPMU_SIGNUP_USER_NOTIFICATION prin mutarea FALSE pe ea (dacă nu este de făcut, litera de activare va fi trimisă de două ori, bine, de fapt două litere diferite).

Funcția ARMYOFSELENGOMEZ_WPMU_SIGNUP_USER_NOTIFICARE ($ utilizator, $ user_mail, tasta $, $ meta \u003d matrice ()) (/////rows_notification () funcția wp_mail ($ user_email, wp_specialchars_decode ($ subiect), $ message, $ message_headers ); Returnează false;) add_filter ("wpmu_signup_user_otificat", "ARYOFSELEGENGOMEZ_WPMU_SIGNUP_USER_NOTIFICATION", 10, 4);

Ca rezultat, pagina de înregistrare din subiectul Selena a început să arate mult mai curat și atenți.

Concluzie

Internetul are multe alte modalități care nu sunt foarte corecte de a face același lucru - Apache Redirects, forme Ajax care nu vor funcționa fără script-ul Java etc. Nu mi-a plăcut foarte mult, așa că am încercat să o fac cel mai corect site-ul meu propriu.

Am observat că fișierele de editare ar trebui să fie capabile să se îndepărteze de la sursă la Ranknesh, dacă WordPress modifică fișierele WP-Signup.phP și WP-Activate.php, au fost mai ușor să le compare pentru a găsi schimbări .

Nu uitați să vă uitați la codul sursă al tuturor funcțiilor descrise mai sus, pentru a face față pe deplin ceea ce și cum se întâmplă în interiorul codului.

Primă. Protecție împotriva spam-urilor

Chiar și cele mai tinere site-uri de pe WordPress sunt adesea supuse înregistrării spamului. Puteți scrie condiții nesfârșite pentru filtrarea roboților, adesea mai asemănătoare cu încercarea de a crea o inteligență artificială 🙂 în cazul unui multisite, o redirecționare obișnuită în Apache ma ajutat, cu care la deschiderea /wp-signup.php și / WP- ACITVATE.PHP, am cerut să emită 404 (nu sunt un expert în stabilirea Apache, astfel încât regulile mele pot să nu fie foarte corecte).

Rewriteengine pe rewritebase / rewriterule ^ wp-signup \\ .php - rewriterule ^ wp-activate \\ .php - # Începe WordPress # Reguli de la WordPress În mod implicit Nu atingeți :) # ... # sfârșitul WordPress

P. S. Încerc să descriu unele lucruri terțe ca în detaliu cât mai mult posibil, pentru că atunci când am început, uneori a fost cumva să spunem și să explic multe lucruri. De asemenea, cred că sfaturi mici similare pe alte materiale cineva va fi împins în studiul unui lucru nou și extinderea domeniului lor de cunoaștere. Expresiile regulate sunt utilizate în înregistrările Reciterule, ele nu sunt complet complexe, de exemplu, simbolul ^ înseamnă începutul liniei.

Se înregistrează o funcție care va fi declanșată în timpul activării pluginului.

Această caracteristică atașează funcția de apelare specificată pentru a cârlig. activați_ (plugin) Și este un înveliș pentru acest cârlig.

(Plugin) în activarea cârligului (pluginul) este înlocuită cu numele relativi, permit fișierului principal al plug-in. De exemplu, dacă se află pluginul: WP-Content / Plugins / SamplePlugin / Sample.php, apoi numele cârligului va fi: Activate_Sampleplugin / Sample.php.

De la versiunea 3.1. Cârligul este declanșat numai în timpul activării pluginului și nu funcționează în timpul actualizării automate a pluginului.

Cum functioneaza

Pluginul este activat de funcția activate_plugin () în care este declanșată activarea cârligului_ (plugin).

Funcția Activate_plugin () în kernel este cauzată după Încărcarea mediului VP. . Această funcție conectează fișierul de conectare master (și tot ce este specificat în acesta) și apoi printr-un cârlig activează funcția de apelare specificată. Datorită acestui lucru, toate funcțiile și clasele plug-in sunt disponibile în funcția noastră de apel invers. Dar, deoarece toate cârligele principale ale WP au lucrat deja în timpul boot-ului mediu, atunci niciun eveniment plug-in nu sunt atârnate pe cârlige, de exemplu plugins_loaded, nu mai funcționează la conectarea fișierului principal de plug-in. Deci, pluginul nostru va fi conectat, dar nu complet: nu ca acesta să se conecteze când este deja activat.

De exemplu, dacă pluginul face ceva în timpul evenimentului Plugins_loaded, atunci toate aceste acțiuni pur și simplu nu se vor întâmpla atunci când activarea plug-in. De exemplu, dacă conectează fișierul de traducere, fișierul de traducere nu va fi conectat la momentul declanșării funcției de callback specificate pentru register_activare_hook ().

De regulă, după declanșarea funcției de callback, există 2 evenimente pentru a închide funcțiile: activate_plugin și oprire.

Pentru a face ceva extraordinar când pluginul este activat, consultați Exemplul 5.

Termeni de utilizare

Funcția nu va funcționa dacă o numiți în momentul cârligului, de exemplu, plugin-uri_loaded, init. Funcția trebuie să fie numită direct din fișierul principal plug-in. Reguli de activare:

    register_activetion_Hook () ar trebui să fie apelat din fișierul plugin principal, de unde se află directiva privind numele pluginului: ... și nu ar trebui să fie chemată de la orice cârlig, cum ar fi plugin-urile_loaded sau init.

    Funcția de cârlig ar trebui să fie în același fișier ca cârlig sau conectați în avans de la un alt fișier.

    Funcția cârligului nu funcționează pe ecran (ecou). Deoarece au loc redirecționarea și ecoul. Dar puteți folosi Die ().

  1. Variabilele globale (dacă există) trebuie să fie determinate în mod explicit pentru a le accesa din funcția de cârlig.

Note despre zona variabilelor

La activarea pluginului, fișierul principal principal nu este conectat în zona globală, dar în interiorul funcției Activate_plugin (). Prin urmare, variabilele considerate globale în modul obișnuit de funcționare a pluginului.

Deci, funcția care este utilizată în Register_activetion_Hook () poate să nu vadă variabilele globale, chiar dacă le-ați declarat la nivel global în interiorul acestei funcții. Exemplu:

$ Myvar \u003d "ceva"; Register_Activare_Hook (__ File__, "MyPlugin_activate"); Funcție MyPlugin_activă () (Global $ myvar; Echo $ myvar; // Variabila nu este egală cu "ceva")

Din cauza acestei caracteristici, ar trebui să fie întotdeauna specificate variabile globale. Toate variabilele globale trebuie să fie definite ca globale, chiar dacă variabila este indicată în corpul plug-in-ului. Numai în acest caz va fi acces la ele oriunde. Exemplu:

Global $ myvar; // indicați clar că aceasta este o variabilă globală $ myvar \u003d "ceva"; Register_Activare_Hook (__ File__, "MyPlugin_activate"); Funcție MyPlugin_active () (Global $ myvar; Echo $ myvar; //\u003e ceva)

Nu există cârlige.

Se intoarce

nUL. Nimic nu se întoarce.

Folosind.

Register_Activare_Hook ($ fișier, $ funcție); $ fișier. (șir) (necesar) Calea către fișierul PHP principal, inclusiv numele pluginului în sine. De obicei, a folosit magia constantă PHP __file__. $ Funcția. (linie / matrice / lambda) (obligatoriu)

Numele funcției de apel invers. Pentru clase, utilizați un matrice: matrice ($ acest, "Numele funcției"); .

Funcția va primi o variabilă logică $ Network_wide - indiferent dacă pluginul este activat pentru întreaga rețea de site-uri, cu multisatul.

Exemple

#unu. Rularea unei funcții la activarea pluginului

Presupunem că avem o funcție my_plugin_activate () în fișierul principal de plugin: wp-content / plugin-uri / myplugin / myplugin.php, apoi pentru a începe această funcție în timpul activării pluginului, utilizați un astfel de cod:

Register_Activare_Hook (__ File__, "my_plugin_activ"); Funcția my_plugin_activate () (// cod de activare ...)

# 2. Pornirea unei metode de clasă

Dacă pluginul utilizează clasa PHP, codul de activare este adăugat ca:

Register_Activare_Hook (__ File__, Array ("My_plugin", "Instalare")); Clasa My_plugin (Funcția statică Instalare () (// nu creează nici o ieșire aici ...)

# 3. Rulați o metodă de clasă dintr-un fișier separat

Dacă clasa care conține funcția de activare este într-un fișier separat, apoi înregistrați funcția de activare după cum urmează:

Include_once __dir__. "/class-my_plugin.php"; Register_Activare_Hook (__ File__, Array ("My_plugin", "on_activate_function"));

#four. Rulați o clasă de clasă din clasă

Dacă sunteți în interiorul __construct (). Important, __file__ ar trebui să "uite" la fișierul plugin principal:

Register_Activare_Hook (__ Fișier, matrice ($ aceasta, "your_method_name"));

# 5 Faceți ceva imediat după activarea pluginului

După activarea pluginului, sunt declanșate doar două cârlige: activate_plugin și oprire.

Când trebuie să faceți ceva imediat după activarea pluginului, puteți atașa funcția acestora.

Când această soluție nu este potrivită, puteți utiliza opțiunile WP: Salvați datele la opțiune și apoi verificați disponibilitatea opțiunii și faceți ceva dacă opțiunea este:

// fișier principal de plug-in. ... Funcție my_plugin_activate () (// adăugați o opțiune la atunci dacă este de a face orice. add_option ("activat_plugin", "plugin-slug"); // aici codul de activare ...) Register_activetion_Hook (__ File__, " my_plugin_activat "); Funcție load_plugin () (dacă este_admin () && get_option ("activat_plugin") \u003d\u003d "plugin-slug") (// eliminați opțiunea adăugată, astfel încât să nu mai funcționeze // și să faceți ceea ce aveți nevoie ... Delete_Option ("Activat_plugin"); // face ceva o dată, după activarea plug-in // de exemplu: add_action ("init", "my_init_function");)))))) ("admin_init", "load_plugin");

O altă opțiune de a face ceva în timpul activării plug-in-ului este de a crea propriul eveniment ca acesta:

Funcție my_plugin_activatul () (// instalați cârligul, astfel încât să puteți merge la el din pluginul DO_ACTION în sine ("my_plugin_activ");) register_activtion_hook (__ file__, "my_plugin_activ");

# 6 O altă demonstrație de utilizare a funcției

Un mic plugin care demonstrează modul de utilizare a funcției:

/ * Nume plugin: o descriere a testelor: un test * / cerință_once Dirname (__ File__). "/my_other_file.php"; / * Acest cod nu va funcționa. Cârligul de activare trebuie apelat din fișierul principal. Register_Activare_Hook (DIRNAME (__ File__). "/My_other_file.php", "my_other_function"); * / // Acesta este un cod de lucru. Register_Activare_Hook (__ File__, "test_activat"); / * Aceasta este opțiunea de anunțare corectă și accesul la variabilele globale. Variabilele globale ar trebui să fie declarate clar. Fără acest lucru, nu veți avea acces la ele. * / Global $ some_var; $ some_var \u003d "Hei"; . * Opțiunea nu va funcționa. Dacă aveți nevoie să înregistrați jurnalele într-un fișier temporar, utilizați Fopen / FWRITE. Dacă doriți să verificați dacă funcționează cârligul de activare, utilizați ieșirea () în interiorul funcției cârligului * / Echo "Test_activat numit ! ";)