Modelis aktyvuoti php. Kaip sukurti tinkintą registracijos puslapį „WordPress Multisite“.

Šiandien pažvelgsime į kritinės 1 dienos pažeidžiamumo išnaudojimą populiarioje TVS Joomla, kuri internete sprogo spalio pabaigoje. Apie pažeidžiamumą kalbėsime su skaičiais CVE-2016-8869, CVE-2016-8870 Ir CVE-2016-9081. Visi trys yra iš vieno kodo, kuris penkerius ilgus metus gulėjo sistemos gilumoje ir laukė sparnuose, kad paskui išsilaisvintų ir atsineštų chaosą, įsilaužtas svetaines ir nekaltų šios Joomla vartotojų ašaras. Tik patys narsiausi ir drąsiausi kūrėjai, kurių akys paraudo nuo monitorių šviesos, o klaviatūros nusėtas duonos trupiniais, sugebėjo mesti iššūkį siautėjančioms piktosioms dvasioms ir padėti galvą ant pataisymų altoriaus.

ĮSPĖJIMAS

Visa informacija pateikiama tik informaciniais tikslais. Nei redaktoriai, nei autorius neatsako už bet kokią galimą žalą, padarytą dėl šio straipsnio medžiagos.

Kur viskas prasidėjo

2016 m. spalio 6 d. Demis Palma sukūrė temą „Stack Exchange“, kurioje paklausė: kodėl iš tikrųjų Joomla 3.6 versijoje yra du būdai registruoti vartotojus su tuo pačiu vardu register()? Pirmasis yra UsersControllerRegistration valdiklyje, o antrasis yra UsersControllerUser valdiklyje. Damis norėjo sužinoti, ar kažkur buvo naudojamas UsersControllerUser::register() metodas, ar tai tik evoliucinis anachronizmas, likęs iš senosios logikos. Jam rūpėjo tai, kad net jei šio metodo nenaudoja joks vaizdas, jį galima iškviesti naudojant sukurtą užklausą. Į kurį gavau atsakymą iš kūrėjo slapyvardžiu itoctopus, kuris patvirtino: problema tikrai egzistuoja. Ir išsiuntė ataskaitą Joomla kūrėjams.

Tada įvykiai vystėsi greičiausiai. Spalio 18 d. Joomla kūrėjai priėmė ataskaitą iš Damis, kuris iki to laiko buvo parengęs PoC, kuris leistų registruotis vartotoją. Savo svetainėje jis paskelbė pastabą, kurioje bendrai papasakojo apie rastą problemą ir savo mintis šiuo klausimu. Tą pačią dieną išleidžiama nauja Joomla 3.6.3 versija, kurioje vis dar yra pažeidžiamas kodas.

Po to Davide'as Tampellini išsuka klaidą taip, kad užregistruotų ne paprastą vartotoją, o administratorių. O spalio 21 d. Joomla apsaugos komandai atkeliauja naujas atvejis. Jau kalbama apie privilegijų didinimą. Tą pačią dieną Joomla svetainėje pasirodo pranešimas, kad antradienį, spalio 25 d., bus išleista kita versija 3.6.3 serijos numeriu, kuri ištaisys kritinį sistemos branduolio pažeidžiamumą.

Spalio 25 d. Joomla Security Strike Team randa naujausią problemą, kurią sukūrė Damiso aptikta kodo dalis. Tada spalio 21 d. įsipareigojimas nepastebimu pavadinimu „Prepare 3.6.4 Stable Release“ perkeliamas į pagrindinę oficialios „Joomla“ saugyklos šaką, kuri ištaiso apgailėtiną klaidą.

Po šio pasirodymo daugybė suinteresuotų asmenų prisijungia prie kūrėjų bendruomenės - jie pradeda reklamuoti pažeidžiamumą ir rengti išnaudojimus.

Spalio 27 d. mokslininkas Harry Robertsas įkelia paruoštą išnaudojimą į „Xiphos Research“ saugyklą, galinčią įkelti PHP failą į serverį su pažeidžiama TVS.

Detalės

Na, fonas baigėsi, pereikime prie įdomiausios dalies – pažeidžiamumo analizės. Joomla 3.6.3 įdiegiau kaip bandomąją versiją, todėl visi eilučių numeriai bus svarbūs šiai versijai. Ir visi keliai į failus, kuriuos pamatysite žemiau, bus nurodyti, palyginti su įdiegtos TVS šaknimis.

Damis Palmos atradimo dėka žinome, kad yra du būdai, kurie atlieka vartotojo registraciją sistemoje. Pirmąjį naudoja TVS ir jis yra faile /components/com_users/controllers/registration.php:108. Antrasis (kurį turėsime iškviesti) yra /components/com_users/controllers/user.php:293. Pažvelkime į tai atidžiau.

286: /** 287: * Vartotojo registravimo būdas. 288: * 289: * @return loginis 290: * 291: * @nuo 1.6 292: */ 293: viešosios funkcijos registras() 294: ( 295: JSession::checkToken("post") arba jexit(JText::_ ("JINVALID_TOKEN")); ... 315: $return = $model->validate($form, $data) 318: if ($return === false) Užbaikite registraciją 346: $return = $modelis->register($duomenys);

Čia palikau tik įdomias eilutes. Visą pažeidžiamo metodo versiją galima peržiūrėti Joomla saugykloje.

Išsiaiškinkime, kas vyksta įprasto vartotojo registracijos metu: kokie duomenys siunčiami ir kaip jie apdorojami. Jei nustatymuose įjungta vartotojo registracija, formą galite rasti adresu http://joomla.local/index.php/component/users/?view=registration.


Teisėta vartotojo registracijos užklausa atrodo taip, kaip šioje ekrano kopijoje.


Komponentas com_users yra atsakingas už darbą su vartotojais. Atkreipkite dėmesį į užduoties parametrą užklausoje. Jis turi formatą $controller.$method . Pažvelkime į failo struktūrą.

Aplanke esančių scenarijų pavadinimai valdikliai atitinka iškviestų valdiklių pavadinimus. Kadangi mūsų užklausoje dabar yra $controller = "registration" , failas bus iškviestas registracija.php ir jo registras() metodas.

Dėmesio, klausimas: kaip perkelti registracijos apdorojimą į pažeidžiamą kodo vietą? Tikriausiai jau atspėjote. Pažeidžiamų ir realių metodų pavadinimai yra vienodi (registras), todėl tereikia pakeisti iškviesto valdiklio pavadinimą. Kur yra mūsų pažeidžiamas valdiklis? Teisingai, byloje user.php. Pasirodo $controller = "vartotojas" . Viską sudėjus gauname task = user.register . Dabar registracijos užklausa apdorojama tokiu būdu, kurio mums reikia.


Antras dalykas, kurį turime padaryti, yra siųsti duomenis tinkamu formatu. Čia viskas paprasta. Legitimate register() tikisi iš mūsų masyvo, vadinamo jform , kuriame perduodame registracijos duomenis – vardą, prisijungimo vardą, slaptažodį, el. paštą (žr. ekrano kopiją su užklausa).

  • /components/com_users/controllers/registration.php: 124: // Gaukite vartotojo duomenis. 125: $requestData = $this->input->post->get("jform", array(), "masyvas");

Mūsų klientas gauna šiuos duomenis iš masyvo, vadinamo vartotoju.

  • /components/com_users/controllers/user.php: 301: // Gaukite formos duomenis. 302: $duomenys = $this->input->post->get("vartotojas", masyvas(), "masyvas");

Todėl visų užklausoje esančių parametrų pavadinimus keičiame iš jfrom į user .

Trečias žingsnis yra rasti tinkamą CSRF prieigos raktą, nes be jo nebus registracija.

  • /components/com_users/controllers/user.php: 296: JSession::checkToken("post") arba jexit(JText::_("JINVALID_TOKEN"));

Tai atrodo kaip MD5 maiša, kurią galite paimti, pavyzdžiui, iš autorizacijos formos svetainėje /index.php/component/users/?view=login.


Dabar galite kurti vartotojus naudodami norimą metodą. Jei viskas pavyko, sveikiname – jūs tiesiog išnaudojote pažeidžiamumą CVE-2016-8870„Trūksta naujų vartotojų registravimo leidimo patikros“.

Taip atrodo UsersControllerRegistration valdiklio „darbo“ registro() metodas:

  • /components/com_users/controllers/registration.php: 113: // Jei registracija išjungta - Peradresuoti į prisijungimo puslapį. 114: if (JComponentHelper::getParams("com_users")->get("allowUserRegistration") == 0) 115: ( 116: $this->setRedirect(JRoute::_("index.php?option=com_users&view= prisijungimas", klaidinga)); 117: 118: grąžinti klaidingą; 119: )

Ir taip pažeidžiamuose:

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

Taip, jokiu būdu.

Kad suprastume antrąją, daug rimtesnę problemą, išsiųsime savo sukurtą užklausą ir pažiūrėkime, kaip ji vykdoma įvairiose kodo dalyse. Štai dalis, atsakinga už vartotojo pateiktų duomenų patvirtinimą darbuotojo metodu:

Tęsinys prieinamas tik nariams

1 variantas. Prisijunkite prie „svetainės“ bendruomenės ir perskaitykite visą svetainėje esančią medžiagą

Narystė bendruomenėje per nurodytą laikotarpį suteiks prieigą prie VISOS „Hacker“ medžiagos, padidins asmeninę kaupiamąją nuolaidą ir leis kaupti profesionalų „Xakep Score“ įvertinimą!

Leidžia naudoti vieną „WordPress“ diegimą kelioms svetainėms vienu metu. Tokiu atveju kiekviena svetainė gauna savo lenteles duomenų bazėje su unikaliu priešdėliu.

Lentelės su registruotų vartotojų duomenimis yra bendros visoms tinklo svetainėms. Tai neabejotinas pliusas ir vieną kartą užsiregistravę galėsite pasiekti kelias svetaines. Be to, kiekvienoje svetainėje ta pati paskyra gali turėti skirtingas teises. Pavyzdžiui, vienoje svetainėje vartotojas gali būti redaktorius, o kitoje – administratorius.

Įprasto „WordPress“ diegimo metu registracijos, prisijungimo ir slaptažodžio nustatymo iš naujo puslapį išveda failas wp-login.php.

  • wp-login.php – autorizacija
  • wp-login.php?action=register – registracija
  • wp-login.php?action=lostpassword – slaptažodžio nustatymas iš naujo

Įjungus kelių svetainių režimą, „WordPress“ branduolys pradeda veikti šiek tiek kitaip, o kai paspausite nuorodą wp-login.php?action=register, įvyks peradresavimas į wp-signup.php. Tai yra jūsų tinklo registracijos puslapis, kuris pagal numatytuosius nustatymus pateikiamas kartu su „WordPress“.

Be įprastų vartotojų abonementų registravimo, joje taip pat galite sukurti naują svetainę, jei superadministratorius įjungė šią funkciją tinklo nustatymuose (Tinklo administratorius → Nustatymai → Tinklo nustatymai).

Daugumoje temų registracijos puslapis neatrodo labai gerai. Daugelis temų naudoja CSS sistemas, pvz., „Bootstrap“, ir savo pasirinktines klases, kad sukurtų skirtingų puslapių elementų stilių, todėl sunku parašyti vieną HTML, tinkantį visiems.

Tačiau nenusiminkite, jei puslapis atrodo netvarkingas. Failas wp-signup.php yra puikus dalykas iš pradžių, kai neturite laiko dirbti su kiekviena svetainės detale – galite sutelkti dėmesį į kitus svarbesnius puslapius ir turinį.

Kai būsite pasiruošę sukurti savo registracijos puslapį, wp-signup.php yra geras pavyzdys, padedantis suprasti „WordPress“ teikiamų funkcijų spektrą, skirtą apdoroti ir patvirtinti vartotojo įvestį bei kurti naujas paskyras.

Pagrindinė tinklo svetainė

Pagal numatytuosius nustatymus „WordPress“ atidaro registracijos puslapį (wp-signup.php) pagrindiniame tinklo domene (svetainėje). Tačiau galite sukurti kiekvienos tinklo svetainės registracijos puslapius, net jei jie turi temų.

Mes apsvarstysime atvejį, kai visos tinklo svetainės naudoja tą pačią temą, tačiau kiekviena iš jų turi registracijos puslapį. Svetainės skiriasi kalbomis (anglų ir rusų), todėl registracijos puslapis bus rodomas „gimtąja“ svetainės kalba. Jei svetainėse naudojamos skirtingos temos, viskas priklausys nuo to, kokios jos temos, ar joms tiks tas pats išdėstymas (puiki situacija, galinti paskatinti suvienodinti visas temas), ar verta puslapius kurti atskirai.

Funkcijos.php alternatyva

Failų tvarka

MU įskiepiuose gali būti bet koks failų skaičius ir struktūra, kuri jums atrodo logiška. Aš laikausi kažko panašaus į šią hierarchiją:

| mu-plugins | | load.php | | selena-network | | | registracija | | | | plugin.php | | | ... | | | jetpack | | | | plugin.php

Į load.php failą yra vertimai ir visi reikalingi „įskiepiai“:

// Įkeliami MU įskiepių vertimai load_muplugin_textdomain("selena_network", "/selena-network/languages/"); // Registracijos puslapio funkcionalumui reikalingas WPMU_PLUGIN_DIR . "/selena-network/signup/plugin.php"; // Kitas papildinys // reikalauja WPMU_PLUGIN_DIR ...

Papildinių aplankai saugomi selena tinklo kataloge. Kiekvienas turi savo plugin.php, kurį įtraukiame į load.php. Tai suteikia jums lankstumo ir galimybę akimirksniu išjungti ir įjungti atskirus darbo projekto komponentus avarijos atveju.

Registracijos puslapis

Išsiaiškinę, kur ir kaip parašysime kodą, galime pereiti prie registracijos puslapio kūrimo.

Per įprastą sąsają sukurkime puslapį su adresu example.org/signup/. Galite naudoti bet kokį URL, kuris atrodo tinkamas jūsų projektui.

Peradresuokite į norimą registracijos puslapį

Kad „WordPress“ sužinotų apie mūsų naują registracijos puslapį ir tiksliai į jį nukreiptų, paspaudus nuorodą „Registruotis“, naudojamas wp_signup_location filtras. Jį galima rasti wp-login.php ir pagal numatytuosius nustatymus yra atsakingas už nukreipimą į wp-signup.php.

Atvejis "register" : if (is_multisite()) ( wp_redirect(apply_filters("wp_signup_location", network_site_url("wp-signup.php"))); išeiti; // ...

Kaip prisimenate, pagal numatytuosius nustatymus registracijos puslapis atidaromas pagrindiniame tinklo domene. Štai kodėl čia naudojamas network_site_url().

Pridėkime savo tvarkyklę prie filtro, esančio mu-plugins/selena-network/signup/plugin.php, kuris pateiks registracijos puslapio adresą dabartinėje svetainėje:

Funkcija selena_network_signup_page($url) ( return home_url("prisiregistravimas"); ) add_filter("wp_signup_location", "selena_network_signup_page", 99);

selena_network yra priešdėlis, kurį naudoju visų savo svetainės MU įskiepių funkcijų pavadinimuose, kad išvengčiau susidūrimų. Jis turėtų būti pakeistas jūsų unikaliu priešdėliu. Filtro pridėjimo prioritetas yra 99, nes kai kurie įskiepiai, pavyzdžiui, bbPress ir BuddyPress, gali perrašyti šį adresą savo (MU įskiepiai įkeliami anksčiau nei įprasti įskiepiai, žr. aukščiau).

Atkreipkite dėmesį, kad naudojamas home_url(), kuris, skirtingai nei network_site_url(), grąžina dabartinės svetainės, o ne pagrindinės tinklo svetainės adresą.

Funkcionalumas wp-signup.php

Wp-signup.php faile yra daug funkcijų ir kodo. Norėdami pamatyti bendrą vaizdą, galite naudoti kodo lankstymą. Paprastai angliškai tai vadinama „kodo lankstymu“.

Pačioje failo pradžioje nuo 1 iki 80 eilučių (4.1.1 versijoje) atliekami įvairūs patikrinimai ir puslapio „pradžia“ išvedama naudojant get_header() .

Toliau paskelbiama daug metodų, ir prieš pradedant dirbti su jais verta suprasti, ką kiekviena funkcija atlieka. Daugelis jų dažnai naudoja kitas funkcijas su priešdėliu wpmu_, kurios visos nurodytos faile wp-includes/ms-functions.php. Šį skyrių sunku suprasti pačiam nematant kodo. Žemiau pateikiamas trumpas pagrindinių funkcijų aprašymas, jei kiltų kokių nors sunkumų.

  • wpmu_signup_stylesheet() – išveda papildomą CSS registracijos puslapyje.
  • show_blog_form() - svetainės registracijos laukai (adresas, pavadinimas, matomumas paieškos sistemoms).
  • validate_blog_form() – patvirtina įvestą svetainės adresą ir pavadinimą naudojant wpmu_validate_blog_signup() .
  • show_user_form() – vartotojo registracijos laukai (prisijungimo ir el. pašto adresas).
  • validate_user_form() – tikrina įvestą prisijungimo vardą ir el. pašto adresą. paštu naudojant wpmu_validate_user_signup() .
  • signup_another_blog() – laukai naujų svetainių registravimui naudojant show_blog_form() jau užsiregistravusiems svetainėje.
  • validate_another_blog_signup() – patikrina svetainės adresą ir pavadinimą, naudodamas validate_blog_form() .
  • signup_user() yra pagrindinė funkcija, rodanti registracijos puslapio laukus.
  • validate_user_signup() – tikrina prisijungimo vardą ir el. pašto adresą. paštu naudojant validate_user_form() .
  • signup_blog() - laukai, skirti įvesti svetainės adresą, pavadinimą ir matomumą (antras registracijos veiksmas), naudojant show_blog_form() .
  • validate_blog_signup() – tikrina prisijungimą, el. pašto adresą. pašto adresą, adresą ir svetainės pavadinimą.

Pačiame wp-signup.php failo apačioje (iš 646 eilutės 4.1.1 versijoje) yra pagrindinė registracijos puslapio logika, kurioje naudojami visi aukščiau aprašyti metodai. Ši kodo dalis į funkciją neįtraukta. Pabaigoje iškviečiamas get_footer().

Nukopijuokite wp-signup.php funkcijas

Toliau bus aprašyta wp-signup.php kopijavimo į MU papildinius ir „šakės“ pakeitimų procedūra. Tai gali atrodyti ne pats geriausias būdas. Vietoj to, galite rašyti savo funkcijas nuo nulio, kad patvirtintumėte ir parodytumėte formas naudodami klases, o ne įprastas funkcijas. Mano nuomone, wp-signup.php jau turi visą mūsų puslapiui reikalingą logiką, belieka atlikti nedidelius pakeitimus.

Kai WordPress atnaujinamas, wp-signup.php taip pat karts nuo karto keičiasi, tačiau tai nereiškia, kad turėsite sinchronizuoti savo "šakutę" su kiekvienu leidimu. Wp-signup.php esančios funkcijos iš esmės susijusios tik su HTML išvestimi, duomenų tikrinimu, paskyrų ir svetainių kūrimu, o metodai su priešdėliu wpmu_, deklaruoti ms-functions.php.

Sukurkime funkciją, kuri puslapyje parodys registracijos formą. Norėdami tai padaryti, nukopijuokite wp-signup.php iš WordPress šaknies į mu-plugings/selena-network/signup/ . Prijunkite jį mu-plugins/selena-network/signup/plugin.php).

Reikalauti WPMU_PLUGIN_DIR. "/selena-network/signup/wp-signup.php";

Pašalinkime visus reikalingus ir nereikalingus patikrinimus nuo pat kopijuoto failo pradžios. 4.1.1 versijoje tai yra visas kodas nuo 1 iki 80 eilučių.

Dabar esame pasiruošę sukurti pagrindinę registracijos formos rodymo funkciją. Norėdami tai padaryti, mes perkelsime visą logiką iš 646 eilutės į patį failo pabaigą į funkciją, pavadintą selena_network_signup_main. Pačioje pabaigoje pašalinsime du papildomus uždarymus

(722 ir 723 eilutės), taip pat get_footer() iškvietimą.

Naujai sukurtame selena_network_signup_main() pačioje pradžioje deklaruosime globalų active_signup kintamąjį, kuris naudojamas visais kitais šio failo metodais. Ir pridėkime skambutį į įvykį before_signup_form, kurį pašalinome pačioje failo pradžioje.

Funkcija selena_network_signup_main() ( global $active_signup; do_action("before_signup_form"); // ... )

Dabar belieka pakeisti maketą visose vietose, kur reikia ir registracijos puslapis paruoštas.

Registracijos formos išvedimas

Čia yra bent du variantai. Patogesnis būdas yra sukurti trumpąjį kodą ir įdėti jį į puslapį per įprastą redaktorių.

// Sukurkite trumpąjį kodą network_signup add_shortcode("network_signup", "selena_network_signup_main");

Antrasis variantas yra sukurti puslapio šabloną page-signup.php savo vaiko temos aplanke. Vietoj žodžio „prisiregistruoti“ galite naudoti puslapiui priskirtą unikalų ID. Šablono viduje pridėkite reikiamą išdėstymą ir tinkamoje vietoje iškvieskite selena_network_signup_main().

Dėl to mano registracijos puslapis atrodė daug geriau ir švaresnis.

Aktyvinimo puslapis

Pagal numatytuosius nustatymus „WordPress“ padalija registracijos procesą į „Multisite“ į du etapus – užpildykite formą svetainėje ir suaktyvinkite paskyrą paspaudę el. laiške atsiųstą nuorodą. Kai užpildysite ankstesnėje skiltyje sukurtą formą, „WordPress“ išsiunčia el. laišką su trumpomis instrukcijomis ir nuoroda, kaip suaktyvinti paskyrą.

„WordPress“ šakniniame kataloge esantis failas wp-activate.php yra atsakingas už aktyvinimo puslapio rodymą. wp-activate.php taip pat gali būti visiškai pakeistas. Procesas panašus į tai, ką jau padarėme wp-signup.php.

Sukurkime puslapį example.org/activate/ per įprastą sąsają. Adresui naudokite bet kokį URL, kuris jums atrodo tinkamas.

Nukopijuokime wp-activate.php failą į savo MU įskiepius ir prijunkite jį prie mu-plugins/selena-network/signup/plugin.php.

Reikalauti WPMU_PLUGIN_DIR. "/selena-network/signup/wp-activate.php";

Viduje nėra daug turinio, skirtingai nei wp-signup.php. Failas atlieka vieną operaciją – suaktyvina paskyrą, jei gaunamas teisingas raktas ir parodo pranešimą apie klaidą arba sėkmingą operacijos atlikimą.

Pašalinkime visus nereikalingus patikrinimus ir reikalavimą – nuo ​​1 iki 69 WordPress 4.1.1 eilučių. Pačioje pabaigoje pašalinsime get_footer() iškvietimą. Likusį turinį perkelsime į funkciją selena_network_activate_main().

Įdomu pastebėti, kad čia prieš įkeliant WordPress (wp-load.php) buvo deklaruota pastovi WP_INSTALLING. Dėl jo buvimo „WordPress“ neįkelia papildinių.

Kaip ir registracijos puslapio atveju, belieka kur reikia pataisyti maketą. Taip pat galite keisti rodomų pranešimų tekstą (tokiu atveju nepamirškite prie visų vertėjo funkcijų pridėti savo MU įskiepių teksto srities; pagal nutylėjimą jis niekur neįdiegtas).

Paruošta funkcija gali būti naudojama iš anksto sukurtame puslapyje naudojant trumpąjį kodą arba atskirą šabloną antrinėje temoje.

Aktyvinimo laiškai su teisingomis nuorodomis

Aktyvinimo puslapis yra paruoštas, tačiau „WordPress“ apie tai nežino ir vis tiek siųs aktyvinimo laiškus su nuoroda į wp-activate.php. Skirtingai nuo wp-signup.php, nėra filtro, kuris leistų pakeisti adresą. Vietoj to turite parašyti savo funkciją, kuri išsiųs laiškus su tinkamomis nuorodomis.

Kai užpildote ir pateikiate formą registracijos puslapyje, „WordPress“ paskambina wpmu_signup_ Vartotojas() arba wpmu_signup_ dienoraštį() priklausomai nuo registracijos tipo. Abi funkcijos sukuria naują įrašą wp_signups lentelėje, užpildydamos ją reikiamu turiniu, kuriame yra paskyros aktyvinimo raktas.

Vėliau, priklausomai nuo funkcijos, iškviečiama wpmu_signup_ Vartotojas _notification() arba wpmu_signup_ dienoraštį _notification() . Abi funkcijos turi panašias funkcijas – jos generuoja ir siunčia el. laišką su aktyvinimo nuoroda, tačiau priima skirtingus argumentus. Abu turi filtrus, kad „perimtų“ įvykį.

If (! apply_filters("wpmu_signup_user_notification", $vartotojas, $naudotojo_el. paštas, $raktas, $meta)) grąžina false;

Norėdami suaktyvinti paskyras su tinklaraščio kūrimu:

If (! apply_filters("wpmu_signup_blog_notification", $domenas, $kelis, $pavadinimas, $vartotojas, $naudotojo_el.paštas, $raktas, $meta)) ( return false; )

Belieka parašyti savo tvarkykles, kurių viduje siųsti laiškus per wp_mail() , o pačioje pabaigoje būtinai grąžinti false, kad WordPress neišsiųstų aktyvinimo laiško du kartus – vienas tavo, kitas pagal nutylėjimą laiškas su nuoroda į wp-activate.php .

Funkcija selena_network_wpmu_signup_user_notification($user, $user_email, $key, $meta = array()) ( // Sugeneruokite laiško antraštę, tekstą ir antraštes // ... // Išsiųskite laišką arba pridėkite Cron užduotį, kad išsiųstumėte raidė wp_mail($user_email , wp_specialchars_decode($subject), $message, $message_headers // Nurodykite false, kad WordPress neišsiųstų aktyvinimo el. laiško du kartus return false("wpmu_signup_user_notification", "selena_network_us_wpmu,_notification"); ;

Jei siunčiate el. laiškus per SMTP serverį arba registracijų skaičius yra labai didelis, turėtumėte apsvarstyti galimybę nesiųsti el. Vietoj to galite pridėti „Cron“ užduočių naudodami „WordPress Cron“.

Uždarome prieigą prie wp-signup.php ir wp-activate.php

Sukūrę savo registracijos ir aktyvinimo puslapius, galbūt norėsite uždaryti „originalus“. Pavyzdžiui, jei registracijos puslapyje yra papildomų laukų, kuriuos būtina užpildyti. Be to, daugeliui „WordPress“ svetainių taikoma šlamšto registracija.

Galite išspręsti dvi problemas vienu veiksmu, paprašydami „Apache“ grąžinti 404, jei bandysite atidaryti šiuos puslapius. Norėdami tai padaryti, jums tereikia į savo konfigūracijos failą arba .htaccess pridėti keletą papildomų RewriteRules.

RewriteEngine On RewriteBase / # Žinios apie reguliarius posakius niekada nebus nereikalingos :) RewriteRule ^wp-signup\.php - RewriteRule ^wp-activate\.php - # PRADĖTI WordPress # Pagal numatytuosius nustatymus WordPress taisyklių neliečiame :) # .. # WordPress

Išvada

Internete yra daugybė šios ir daugelio kitų „WordPress“ „problemų“ sprendimų. Pavyzdžiui, norint sukurti registracijos ir aktyvinimo puslapius, kai kurie siūlo perrašyti originalius wp-signup.php ir wp-activate.php . To daryti nereikėtų, nes atnaujinę WordPress prarasite visus failuose atliktus pakeitimus, taip pat negalėsite patikrinti branduolio vientisumo naudodami .

Kurdami bet kokį priedą, temą ar sprendimą, turėtumėte skirti šiek tiek laiko suprasti, kas vyksta „WordPress“. Tam yra daug naudingų derinimo įrankių.

P.S.

Norėdami automatiškai priskirti skirtingus vaidmenis naujiems vartotojams, galite naudoti kelių svetainių naudotojų valdymo papildinį.

Jei perskaitę straipsnį turite klausimų ar sunkumų kuriant registracijos ir aktyvinimo puslapius, palikite komentarą ir mes tikrai atsakysime.

27.03.2015 27.03.2015

WordPress kūrėjas. Mėgsta tvarką visame kame ir supranta naujas priemones. Įkvėptas Symfony komponentų architektūros.

  • Temos dažniausiai neveikia, bet kartais mums, kūrėjams, reikia įdiegti kai kurias funkcijas į savo temą, kad ji būtų šiek tiek geresnė ir patogesnė.

    Šioje pamokoje išnagrinėsime terminą „įskiepių teritorija“ ir išmoksime naudotis fantastišku Thomaso Griffino įrankiu: TGM papildinio aktyvinimo biblioteka.

    Temos funkcionalumas: įsiveržia į papildinio teritoriją

    Temos skirtos pakeisti „WordPress“ svetainės dizainą. Idealiu atveju tema turėtų būti skirta tik vizualiniam aspektui. Tačiau šiame auksiniame „WordPress“ amžiuje įskiepių kūrėjai dažnai į savo temas įtraukia funkcines funkcijas, padedančias išlikti konkurencingiems rinkoje.

    Tai yra įsiveržimas į papildinio teritoriją. Galime galvoti apie „įskiepių teritoriją“ kaip kai kurias funkcines kodo dalis. Bet kokia kodo dalis, pakeičianti jūsų svetainės funkcionalumą, turėtų būti papildinio forma, nebent minėtas kodas yra integruotas į „WordPress“ branduolį.

    Anksčiau viename iš savo straipsnių jau suformulavau nykščio taisyklę „įskiepių teritorijai:

    Jei funkcija yra susijusi su vizualiniu svetainės pristatymu, ji turėtų būti įtraukta į temą; jei tai susiję su funkcionalumu, tai jis turėtų būti pateikiamas kaip atskiras įskiepis.

    Gana paprasta taisyklė. Žmonės vis dar bando į savo temas koduoti funkcinius bitus, tačiau temų katalogai (pvz., WordPress.org arba ThemeForest) nepriima temų, kurios patenka į „įskiepių teritoriją“. Taigi, pasiūlyti funkcionalumą temose tapo tam tikru iššūkiu.

    Laimei, yra paprastas sprendimas, kuris neprieštarauja papildinio teritorijos taisyklei.

    Įvadas į TGM papildinio aktyvinimo biblioteką

    TGM papildinio aktyvinimo nustatymas

    Atkreipkite dėmesį į funkciją tgmpa() su dviem parametrais pačioje kodo pabaigoje. Antrasis parametras yra $config kintamasis, kuris taip pat yra masyvas, kaip $plugins. Kaip rodo pavadinimas, naudodami šį masyvą galite tinkinti TGM papildinio aktyvinimo biblioteką. Kintamasis taip pat priima savo parinkčių rinkinį:

    • id (eilutė) – unikalus jūsų temos TGM papildinio aktyvinimo bibliotekos ID. Tai labai svarbu: jei kiti papildiniai taip pat naudoja TGM įskiepio aktyvinimą, skirtingi ID užkirs kelią galimiems konfliktams.
    • default_path (eilutė) – numatytasis absoliutus jūsų temos papildinių kelias. Įdiegę zip failo pavadinimą galite naudoti kaip papildinio šaltinio parametro reikšmę.
    • meniu (eilutė) – įskiepio diegimo puslapio meniu šliužas.
    • has_notices (loginis) – jei nustatyta į true, bus išduodami administratoriaus pranešimai apie reikalingus / rekomenduojamus papildinius.
    • atmesti (loginis) – jei nustatyta į „true“, vartotojas gali „atmesti“ pranešimus.
    • dismiss_msg (eilutė) – jei atmetimo parinktis nustatyta į false, šis pranešimas bus rodomas virš administratoriaus pranešimo.
    • is_automatic (loginis) – jei nustatyta į true, įskiepiai bus suaktyvinti, kai vartotojas sutiks juos įdiegti.
    • pranešimas (eilutė) – papildoma HTML išvestis prieš įskiepių lentelę.
    • eilutės (masyvas) – masyvas, apimantis rodytinus pranešimus. Galite nurodyti jas kaip išverstas eilutes. Pažiūrėkite į failą example.php, kad pamatytumėte visą visų pranešimų sąrašą.
    "mytheme-tgmpa", // jūsų unikalus TGMPA ID "default_path" => get_stylesheet_directory() . "/lib/plugins/", // numatytasis absoliutus kelias "menu" => "mytheme-install-required-plugins", // meniu šliužas "has_notices" => true, // Rodyti administratoriaus pranešimus "dismissable" => false " suaktyvinti papildinius įdiegus "message" => "", // pranešimas išvedamas tiesiai prieš įskiepių lentelę "strings" => array(); // Pranešimų eilučių masyvas, kurį naudoja TGM papildinio aktyvinimas); ?>

    Išvada

    Kaip matote, „WordPress“ temų funkcionalumas yra įmanomas – tereikia pirmiausia pagalvoti apie vartotojus, kurie gali pereiti nuo vienos temos prie kitos. TGM papildinio aktyvinimo biblioteka siūlo tikrai protingą būdą tai padaryti.

    Ką manote apie šią priemonę? Ar kada nors naudojote, ar planuojate naudoti ateityje? Pasidalinkite savo mintimis!

    Vietoj standartinio wp-signup.php sukuriame savo kelių svetainių registracijos puslapį.

    Įprasto „WordPress“ diegimo metu registracijos puslapis (prisijungimas, slaptažodžio nustatymas iš naujo) išvedamas iš wp-login.php failo.

    • /wp-login.php – autorizacija
    • /wp-login.php?action=register – registracija
    • /wp-login.php?action=lostpassword – slaptažodžio nustatymas iš naujo

    Yra atskiros sąlygos kelioms svetainėms wp-login.php. Taigi, kai paspausite nuorodą /wp-login.php?action=register keliose svetainėse, „WordPress“ nukreips į puslapį /wp-signup.php. Dėl daugelio temų puslapis neatrodo labai patrauklus, todėl sukursime savo.

    Pagrindinė tinklo svetainė

    Pagal numatytuosius nustatymus „WordPress“ atidaro registracijos puslapį (wp-signup.php) pagrindiniame tinklo domene (svetainėje). Tačiau kiekvienai tinklo svetainei galite sukurti atskirą registracijos puslapį, net jei jos skirtingos temos. Nagrinėsime atvejį, kai visos tinklo svetainės turi savo registracijos puslapį, tačiau naudojama ta pati tema ir svetainės skiriasi tik kalba. Jei naudojate skirtingas temas, turėsite parašyti daugiau kodo.

    Funkcijos.php?

    Nr. Atrodo, kad šis failo pavadinimas minimas kiekviename straipsnyje apie „WordPress“. Mūsų atveju, atsižvelgiant į tai, kad registracijos funkcija skirta kelioms svetainėms, prasminga ją įtraukti į MU papildinius, kurie įkeliami atidarius bet kurią svetainę.

    Lyrinis nukrypimas

    Verta paminėti, kad MU įskiepiai įkeliami anksčiau nei įprasti įskiepiai ir dar iki galo įkeliamas WordPress branduolys, todėl kai kurių funkcijų iškvietimas gali sukelti lemtingų PHP klaidų. Toks „ankstyvas“ pakrovimas turi ir privalumų. Tarkime, kad bet kurioje temoje negalite susieti kai kurių veiksmų, kurie suaktyvinami dar prieš tai, kai iš temos įkeliamas failas functions.php. To pavyzdys – veiksmai iš Jetpack įskiepio formos jetpack_module_loaded_related-posts (related-posts – modulio pavadinimas), kurių pagalba galima stebėti Jetpack modulių veiklą. Prie šio veiksmo neįmanoma „prisegti“ iš temos failo, nes veiksmas jau buvo suaktyvintas prieš įkeliant temą – įskiepiai įkeliami prieš temas. Kodekso puslapyje Veiksmų nuoroda galite pažvelgti į bendrą „WordPress“ įkėlimo tvarkos vaizdą.

    Failų tvarka

    MU įskiepiuose gali būti bet koks failų skaičius ir bet kokia struktūra, kuri jums atrodo logiška. Aš laikausi kažko panašaus į šią hierarchiją:

    |-mu-plugins |-|-load.php |-|-|-selena-network |-|-|-|-registracija |-|-|-|-|-plugin.php |-|-|-| -|-... |-|-|-|-jetpack |-|-|-|-|-plugin.php

    Load.php faile yra visi reikalingi mūsų tinklo „įskiepiai“:

    // Įkelti visų priedų vertimus load_muplugin_textdomain ("selena_network", "/selena-network/languages/"); // Norint prisiregistruoti tinkle, reikia WPMU_PLUGIN_DIR . "/selena-network/signup/plugin.php"; // Kiti papildiniai // reikalauja WPMU_PLUGIN_DIR ...

    Aplanke selena-network yra saugomi papildinių aplankai, kurių kiekvienas turi savo plugin.php, kurį įtraukiame į load.php. Tai suteikia jums lankstumo ir galimybę greitai išjungti ir įjungti daiktus.

    Registracijos puslapio adresas

    Norėdami nurodyti registracijos puslapio adresą, naudokite wp_signup_location filtrą. Jį galima rasti wp-login.php faile ir yra atsakingas už peradresavimą į wp-signup.php.

    Atvejis "register" : if (is_multisite()) ( wp_redirect(apply_filters("wp_signup_location", network_site_url("wp-signup.php"))); išeiti;

    Pridėkime savo funkciją prie mu-plugins/selena-network/signup/plugin.php, kuri grąžins registracijos puslapio adresą dabartinėje svetainėje:

    Funkcija selena_network_signup_page ($url) ( return home_url () . "/signup/"; ) add_filter ( "wp_signup_location", "selena_network_signup_page", 99);

    selena_network yra priešdėlis, kurį naudoju visų savo svetainės MU įskiepių funkcijų pavadinimuose, kad išvengčiau susidūrimų. Jis turėtų būti pakeistas jūsų unikaliu priešdėliu. Filtro pridėjimo prioritetas yra 99, nes kai kurie įskiepiai, pavyzdžiui, bbPress ir BuddyPress, gali perrašyti šį adresą savo (MU įskiepiai įkeliami anksčiau nei įprasti įskiepiai, žr. aukščiau). Atminkite, kad home_url() naudojamas vietoj network_site_url(), kad lankytojas liktų tame pačiame domene. Bet koks URL gali būti naudojamas kaip adresas.

    Puslapio kūrimas

    Dabar sukurkime puslapį adresu site.com/signup/ per įprastą sąsają, o antrinės temos aplanke mūsų naujojo puslapio šablonas yra page-signup.php. Vietoj žodžio „prisiregistruoti“ galite naudoti unikalų ID.

    Naujame šablone turite iškviesti funkciją selena_network_signup_main(), kuri parodys registracijos formą.

    Verta paminėti, kad visas šablono procesas yra neprivalomas ir vietoj to galite sukurti savo trumpąjį kodą, kuris taip pat iškvies funkciją selena_network_signup_main().

    wp-signup.php ir wp-activate.php

    Dabar sukurkime funkciją, kuri parodys registracijos formą. Norėdami tai padaryti, nukopijuokite failus wp-signup.php ir wp-activate.php iš WordPress šaknies į mu-plugings/selena-network/signup/ (ir nepamirškite jų prijungti mu-plugins/selena-network /signup/plugin.php) . Tolesnės manipuliacijos su failais yra itin sunkiai ir ilgai aprašomos, todėl jas teks atlikti patiems. Aš tiesiog aprašysiu, ką tiksliai reikia padaryti, ir paskelbsiu savo projekto šaltinio failus:

    1. Failo pradžioje pašalinkite visus reikalingus , funkcijų iškvietimus ir kitą kodą, nepriklausantį funkcijoms.
    2. Pervardykite visas funkcijas, pridėdami unikalius priešdėlius prie pavadinimų.
    3. Apatinę wp-signup.php kodo dalį įvyniokite į funkciją selena_network_signup_main ir pačioje pradžioje parašykite globalų $active_signup; .
    4. Tinkamose vietose išdėstymą pakeiskite savo.

    Wp-activate.php turite padaryti maždaug tą patį:

    1. Pašalinkite visą kodą už funkcijų ribų, apvyniokite išdėstymą į atskirą funkciją.
    2. Kur reikia, pakeiskite išdėstymą.

    Failas wp-activate.php yra atsakingas už paskyros aktyvinimo puslapį. Kaip ir registracijos puslapyje, jam reikia sukurti atskirą šabloną, kurio viduje reikia iškviesti funkciją iš wp-activate.php failo.

    Siunčiami aktyvinimo laiškai

    Registracijos puslapis lankytojui siunčia el. laišką su nuoroda aktyvuoti savo paskyrą. Pagal numatytuosius nustatymus tai atlieka wpmu_signup_user_notification() funkcija iš ms-functions.php failo. Galite pasiskolinti jo funkcijas savo funkcijai. Priežastis vengti naudoti šią funkciją yra ta, kad ji siunčia paskyros aktyvinimo nuorodą iš wp-activate.php. Šią funkciją galite „išjungti“ naudodami wpmu_signup_user_notification filtrą, grąžindami jį false (jei to nepadarysite, aktyvinimo laiškas bus išsiųstas du kartus, gerai, iš tikrųjų dvi skirtingos raidės).

    Funkcija armyofselenagomez_wpmu_signup_user_notification($user, $user_email, $key, $meta = array()) ( // ... // Kodas iš funkcijos wpmu_signup_user_notification() wp_mail($user_email, wp_specialchars_decode($subject,me) ; return false; ) add_filter("wpmu_signup_user_notification", "armyofselenagomez_wpmu_signup_user_notification", 10, 4);

    Dėl to registracijos puslapis Selenos temoje pradėjo atrodyti daug švaresnis ir tvarkingesnis.

    Išvada

    Internete yra daug kitų nelabai teisingų būdų, kaip tą patį padaryti – Apache peradresavimai, AJAX formos, kurios neveiks be Java Script ir t.t. Visa tai man nelabai patiko, todėl stengiausi padaryti taip teisingai, kaip galima mano svetainėje.

    Atkreipiu dėmesį, kad failus reikėtų redaguoti atsargiai ir stengtis per daug nenukrypti nuo originalių, kad ateityje, jei WordPress pakeis wp-signup.php ir wp-activate.php failus, būtų lengviau palyginti tarpusavyje, kad rastų pokyčių.

    Nepamirškite pažvelgti į visų aukščiau aprašytų funkcijų šaltinio kodą, kad suprastumėte, kas ir kaip vyksta kode.

    Premija. Apsauga nuo šiukšlių siuntėjų

    Net ir mažiausios „WordPress“ svetainės dažnai kenčia nuo šiukšlių registracijų. Galima rašyti begalę botų filtravimo sąlygų, dažnai labiau kaip bandymas sukurti dirbtinį intelektą :) Multisite atveju man labai padėjo eilinis peradresavimas Apache, kurio pagalba atidarant paprašiau 404 / wp-signup.php ir /wp-acitvate.php (nesu Apache konfigūravimo ekspertas, todėl mano taisyklės gali būti nelabai teisingos).

    „RewriteEngine“ sistemoje „RewriteBase“ / „RewriteRule“

    P.S. Stengiuosi kuo detaliau aprašyti kai kuriuos trečiųjų šalių dalykus, nes kai pradėjau, kartais nebūdavo kam pasiūlyti ir paaiškinti. Taip pat tikiu, kad tokie smulkūs patarimai apie kitą medžiagą paskatins ką nors išmokti ko nors naujo ir išplėsti savo žinių sritį. RewriteRule įrašuose naudojami reguliarūs posakiai, jie visai nesudėtingi, pavyzdžiui, simbolis ^ reiškia eilutės pradžią.

    Užregistruoja funkciją, kuri suaktyvinama, kai įskiepis bus suaktyvintas.

    Ši funkcija prideda nurodytą atgalinio skambinimo funkciją prie activate_(plugin) kabliuko ir yra to kabliuko įvynioklis.

    (plugin) kabliu activate_(plugin) pakeičiamas santykinio kelio į pagrindinio papildinio failą pavadinimu. Pavyzdžiui, jei įskiepis yra: wp-content/plugins/sampleplugin/sample.php, tada kabliuko pavadinimas bus: activate_sampleplugin/sample.php.

    Nuo 3.1 versijos. Kabliukas suveikia tik aktyvuojant įskiepį, o ne automatiškai atnaujinant papildinį.

    Kaip tai veikia

    Įskiepis aktyvuojamas naudojant funkciją activate_plugin(), kurioje suveikia activate_(plugin) kabliukas.

    Funkcija activate_plugin() branduolyje iškviečiama įkėlus VI aplinką. Ši funkcija sujungia pagrindinį papildinio failą (ir viską, kas jame nurodyta), o tada per kabliuką suaktyvina nurodytą atgalinio skambinimo funkciją. Dėl šios priežasties visos įskiepio funkcijos ir klasės pasiekiamos mūsų atgalinio skambinimo funkcijoje. Tačiau kadangi visi pagrindiniai WP kabliukai jau buvo suaktyvinti, kai įkeliama VI aplinka, prijungus pagrindinį įskiepių failą, jokie papildinio įvykiai, kurie yra pakabinti, pvz., plugins_loaded , nebebus suaktyvinami. Tai reiškia, kad mūsų papildinys bus prijungtas, bet ne visiškai: ne taip, kaip turėtų būti prijungtas, kai jis jau yra suaktyvintas.

    Taigi, pavyzdžiui, jei įskiepis ką nors daro per plugins_loaded įvykį, tada visi tie veiksmai tiesiog neįvyks, kai įskiepis bus aktyvuotas. Pavyzdžiui, jei jame yra vertimo failas, tada vertimo failas nebus įtrauktas tuo metu, kai suaktyvinama registr_activation_hook() nurodyta atgalinio skambinimo funkcija.

    Paprastai po to, kai suaktyvinama atgalinio skambinimo funkcija, yra 2 įvykiai, prie kurių galima prijungti funkcijas: activated_plugin ir shutdown .

    Norėdami suaktyvindami papildinį padaryti ką nors įmantraus, žr. 5 pavyzdį.

    Naudojimo sąlygos

    Funkcija neveiks, jei bus iškviesta, kai suveikia koks nors kabliukas, pvz., plugins_loaded , init . Funkcija turi būti iškviesta tiesiai iš pagrindinio papildinio failo. Aktyvinimo taisyklės:

      register_activation_hook() turi būti iškviečiamas iš pagrindinio įskiepio failo, kad ir kur būtų direktyva Plugin Name: ..., ir neturėtų būti iškviečiamas iš jokio kabliuko, pvz., plugins_loaded arba init .

      Kabliuko funkcija turi būti tame pačiame faile kaip ir kabliukas arba iš anksto prijungta iš kito failo.

      Ekrano išvestis (aidas) neveikia naudojant kabliuko funkciją. Kadangi įvyksta peradresavimas ir nematysite aido. Bet galite naudoti die() .

    1. Visuotiniai kintamieji (jei yra) turi būti aiškiai apibrėžti, kad juos būtų galima pasiekti naudojant „hook“ funkciją.

    Pastaba apie kintamą sritį

    Aktyvinant įskiepį, pagrindinis įskiepio failas įtraukiamas ne į visuotinę sritį, o įtraukiamas į funkciją activate_plugin(). Todėl kintamieji, kurie normaliai veikiant papildiniui laikomi globaliais, nebus globalūs.

    Taigi funkcija, kuri naudojama registre_activation_hook(), gali nematyti visuotinių kintamųjų, net jei šioje funkcijoje juos paskelbėte kaip visuotinius. Pavyzdys:

    $myvar = "kažkas"; register_activation_hook(__FILE__, "myplugin_activate"); function myplugin_activate())( global $myvar; echo $myvar; // Kintamasis nėra lygus "kažkam")

    Dėl šios savybės pasauliniai kintamieji visada turi būti aiškiai nurodyti. Visi pasauliniai kintamieji turi būti apibrėžti kaip globalūs, net jei kintamasis nurodytas papildinio turinyje. Tik tokiu atveju turėsite prieigą prie jų bet kur. Pavyzdys:

    Global $myvar; // aiškiai nurodo, kad tai yra visuotinis kintamasis $myvar = "something"; register_activation_hook(__FILE__, "myplugin_activate"); function myplugin_activate())( global $myvar; echo $myvar; //> kažkas )

    Kabliukų nėra.

    Grąžina

    nulinis. Nieko negrąžina.

    Naudojimas

    register_activation_hook($failas, $funkcija); $ failas (eilutė) (būtina) Kelias į pagrindinį papildinio PHP failą, įskaitant paties papildinio pavadinimą. Paprastai naudojama stebuklinga PHP konstanta __FILE__. $funkcija (styga/masyvas/lambda) (būtina)

    Atgalinio skambinimo funkcijos pavadinimas. Klasėms naudokite masyvą: array($this, "function_name"); .

    Funkcija gaus loginį kintamąjį $network_wide – ar įskiepis suaktyvintas visam svetainių tinklui, kelių svetainių atveju.

    Pavyzdžiai

    #1. Funkcijos paleidimas, kai suaktyvinamas papildinys

    Tarkime, kad pagrindiniame papildinio faile turime funkciją my_plugin_activate(): wp-content/plugins/myplugin/myplugin.php , tada norėdami paleisti šią funkciją įskiepio aktyvinimo metu naudokite šį kodą:

    Register_activation_hook(__FILE__, "my_plugin_activate"); funkcija my_plugin_activate() ( // Aktyvinimo kodas... )

    #2. Klasės metodo vykdymas

    Jei papildinys naudoja PHP klasę, aktyvinimo kodas pridedamas taip:

    Register_activation_hook(__FILE__, array("My_Plugin", "install")); class My_Plugin ( statinė funkcija install() ( // Nekurkite čia jokios išvesties... ) )

    #3. Klasės metodo paleidimas iš atskiro failo

    Jei klasė, kurioje yra aktyvinimo funkcija, yra atskirame faile, užregistruokite aktyvinimo funkciją taip:

    Įtraukti_vieną kartą __DIR__ . "/klasė-My_Plugin.php"; register_activation_hook(__FILE__, array("My_Plugin", "on_activation_function"));

    #4. Klasės metodo vykdymas pačioje klasėje

    Jei esate __construct() viduje. Svarbu, __FILE__ turi „žiūrėti“ į pagrindinio papildinio failą:

    Register_activation_hook(__FILE__, array($this, "YOUR_METHOD_NAME"));

    # 5 Atlikite ką nors iš karto suaktyvinę papildinį

    Suaktyvinus papildinį, suveikia tik du kabliukai: activated_plugin ir shutdown .

    Kai reikia ką nors padaryti iškart suaktyvinus papildinį, galite prie jų pridėti funkciją.

    Kai šis sprendimas netinka, galite naudoti WP parinktis: išsaugokite duomenis pasirinkime, tada patikrinkite, ar parinktis yra, ir atlikite ką nors, jei parinktis yra:

    // Pagrindinis papildinio failas. ... function my_plugin_activate() ( // pridėti parinktį, kad vėliau, jei ji yra, galėtume ką nors padaryti. add_option("Activated_Plugin", "Plugin-Slug"); // Čia yra aktyvinimo kodas... ) register_activation_hook(__FILE__, "my_plugin_activate"); function load_plugin() ( if (is_admin() && get_option("Activated_Plugin") == "Plugin-Slug") ( // ištrinkite pridėtą parinktį, kad ji nebeveiktų // ir atlikite tai, ką reikia padaryti... delete_option("Activated_Plugin "); // Padarykite ką nors vieną kartą, suaktyvinę įskiepį // Pavyzdžiui: add_action("init", "my_init_function" ) ) add_action("admin_init", "load_plugin");

    Kita galimybė ką nors padaryti aktyvinant papildinį – sukurti įvykį taip:

    Funkcija my_plugin_activate())( // Nustatykite savo kabliuką, kad galėtumėte prie jo pridėti iš paties papildinio failų do_action("my_plugin_activate"); ) register_activation_hook(__FILE__, "my_plugin_activate");

    #6 Kitas funkcijos naudojimo demonstravimas

    Mažas papildinys, rodantis, kaip naudoti funkciją:

    /* Papildinio pavadinimas: A Testo aprašymas: A Test */ Reikalauti_once dirname(__FILE__) . "/mano_kitas_failas.php"; /* Šis kodas neveiks. Aktyvinimo kabliukas turi būti iškviestas iš pagrindinio failo. register_activation_hook (dirname(__FILE__) . "/mano_kitas_failas.php", "mano_kita_funkcija"); */ // Tai veikiantis kodas. register_activation_hook(__FILE__, "test_Actived"); /* Tai yra teisingas būdas deklaruoti ir pasiekti visuotinius kintamuosius. Visuotiniai kintamieji turi būti aiškiai deklaruoti. Be to neturėsite prieigos prie jų. */ globalus $some_var; $some_var = "labas"; // Aktyvinimo funkcijos funkcija test_activated())( // čia $some_var nebus lygus hey global $some_var; // O čia $some_var bus lygus ei // Ši funkcija apibrėžta faile "mano_kitas_failas.php" my_other_function(); /* Ši parinktis neveiks. echo "testas_aktyvintas iškviestas!";