Үлгіні белсендіру php. WordPress мультисайтында реттелетін тіркеу бетін қалай жасауға болады

Бүгін біз қазан айының соңында Интернетте жарылған танымал CMS Joomla-дағы 1 күндік маңызды осалдықты пайдалануды қарастырамыз. Біз сандармен осалдықтар туралы айтатын боламыз CVE-2016-8869, CVE-2016-8870Және CVE-2016-9081. Үшеуі де бес жыл бойы рамканың тереңдігінде тұрып, қанатында күткен бір код бөлігінен шыққан, содан кейін босатып, хаос, бұзылған сайттар мен осы Joomla-ның бейкүнә қолданушыларының көз жасын әкеледі. Мониторлардың жарығынан көздері қызарған, пернетақталары нан үгінділеріне толы ең батыл және батыл әзірлеушілер ғана құтырған зұлым рухтарға қарсы тұра алды және түзетулер құрбандық үстеліне бастарын қойды.

ЕСКЕРТУ

Барлық ақпарат тек ақпараттық мақсатта берілген. Редакторлар да, автор да осы мақаланың материалдары келтірген ықтимал зиян үшін жауапты емес.

Бәрі қайдан басталды

2016 жылдың 6 қазанында Демис Пальма Stack Exchange сайтында тақырып құрды, онда ол былай деп сұрады: Joomla 3.6 нұсқасында неге аттас register() пайдаланушыларды тіркеудің екі әдісі бар? Біріншісі UsersControllerRegistration контроллерінде, екіншісі UsersControllerUser контроллерінде. Дамис UsersControllerUser::register() әдісі бір жерде қолданылғанын немесе ескі логикадан қалған эволюциялық анахронизм екенін білгісі келді. Оның алаңдаушылығы бұл әдісті кез келген көрініс қолданбаса да, оны құрастырылған сұрау арқылы шақыруға болады. Оған мен итоктопус лақап атымен әзірлеушіден жауап алдым, ол растады: мәселе шынымен бар. Және Joomla әзірлеушілеріне есеп жіберді.

Содан кейін оқиғалар ең жылдам дамыды. 18 қазанда Joomla әзірлеушілері сол кезде пайдаланушыны тіркеуге мүмкіндік беретін PoC жобасын жасаған Дамистің есебін қабылдады. Ол өзінің веб-сайтында жазба жариялады, онда ол тапқан проблемасы туралы және осы мәселе бойынша өз ойлары туралы жалпылама түрде айтты. Сол күні әлі де осал кодты қамтитын Joomla 3.6.3 жаңа нұсқасы шығарылды.

Осыдан кейін Давиде Тампеллини қатені қарапайым пайдаланушыны емес, әкімшіні тіркеу нүктесіне айналдырады. Ал 21 қазанда Joomla қауіпсіздік тобына жаңа іс келеді. Бұл қазірдің өзінде артықшылықтарды арттыру туралы айтады. Сол күні Joomla веб-сайтында сейсенбі, 25 қазанда жүйелік ядродағы маңызды осалдықты түзететін 3.6.3 сериялық нөмірі бар келесі нұсқасы шығарылатыны туралы хабарландыру пайда болады.

25 қазан Joomla Security Strike Team Damis ашқан код бөлігімен жасалған соңғы мәселені тапты. Содан кейін 21 қазандағы түсініксіз атымен Prepare 3.6.4 Stable Release жазбасы өкінішті қатені түзететін ресми Joomla репозиторийінің негізгі тармағына жіберіледі.

Бұл шыққаннан кейін көптеген қызығушылық танытқан адамдар әзірлеушілер қауымдастығына қосылады - олар осалдықты насихаттайды және эксплойттарды дайындайды.

27 қазанда зерттеуші Гарри Робертс Xiphos Research репозиторийіне PHP файлын осал CMS серверіне жүктей алатын дайын эксплойтты жүктейді.

Егжей

Ал, фон аяқталды, ең қызықты бөлікке - осалдықты талдауға көшейік. Мен Joomla 3.6.3 нұсқасын сынақ нұсқасы ретінде орнаттым, сондықтан барлық жол нөмірлері осы нұсқаға қатысты болады. Төменде көретін файлдарға апаратын барлық жолдар орнатылған CMS түбіріне қатысты көрсетіледі.

Damis Palma ашқан жаңалығының арқасында біз жүйеде пайдаланушыларды тіркеуді жүзеге асыратын екі әдіс бар екенін білеміз. Біріншісі CMS арқылы пайдаланылады және /components/com_users/controllers/registration.php:108 файлында орналасқан. Екіншісі (бізге қоңырау шалу керек) /components/com_users/controllers/user.php:293 ішінде тұрады. Оны толығырақ қарастырайық.

286: /** 287: * Пайдаланушыны тіркеу әдісі. 288: * 289: * @return логикалық 290: * 291: * @1.6 бастап 292: */ 293: жалпы функция тіркелімі() 294: (295: JSession::checkToken("post") немесе jexit(JText::_) ("JINVALID_TOKEN")); ... 300: // 301 пішін деректерін алу: $this->input->post->get("user", array(), "array"); 315: $return = $model->validate($form, $data 316: 317: // Қателерді тексеріңіз: if ($return === false) 319: ( ... 345: / /). Тіркеуді аяқтаңыз 346: $return = $model->register($data);

Мұнда мен тек қызықты жолдарды қалдырдым. Осал әдістің толық нұсқасын Joomla репозиторийінде көруге болады.

Қалыпты пайдаланушыны тіркеу кезінде не болатынын анықтайық: қандай деректер жіберіледі және олар қалай өңделеді. Пайдаланушыны тіркеу параметрлерде қосылса, пішінді http://joomla.local/index.php/component/users/?view=registration сайтынан табуға болады.


Заңды пайдаланушыны тіркеу сұрауы келесі скриншотқа ұқсайды.


com_users компоненті пайдаланушылармен жұмыс істеуге жауапты. Сұраудағы тапсырма параметріне назар аударыңыз. Оның $controller.$method пішімі бар. Файл құрылымын қарастырайық.

Қалтадағы сценарийлердің атаулары контроллерлершақырылатын контроллерлердің атауларына сәйкес келеді. Біздің сұрауымызда қазір $controller = "registration" бар болғандықтан, файл шақырылады register.phpжәне оның register() әдісі.

Назар аударыңыз, сұрақ: тіркеуді өңдеуді кодтың осал жеріне қалай ауыстыруға болады? Сіз оны әлдеқашан болжаған шығарсыз. Осал және нақты әдістердің атаулары бірдей (тізілім), сондықтан бізге тек шақырылатын контроллердің атын өзгерту керек. Біздің осал контроллер қайда орналасқан? Дұрыс, файлда user.php. $controller = "user" болып шықты. Барлығын біріктіріп тапсырма = user.register аламыз. Енді тіркеу сұрауы бізге қажетті әдіспен өңделеді.


Бізге қажет екінші нәрсе - деректерді дұрыс пішімде жіберу. Мұнда бәрі қарапайым. Legitimate register() бізден jform деп аталатын массив күтеді, онда біз тіркеу деректерін – аты, логин, құпия сөз, электрондық поштаны жібереміз (сұраныспен бірге скриншотты қараңыз).

  • /components/com_users/controllers/registration.php: 124: // Пайдаланушы деректерін алыңыз. 125: $requestData = $this->input->post->get("jform", array(), "array");

Біздің клиент бұл деректерді пайдаланушы деп аталатын массивтен алады.

  • /components/com_users/controllers/user.php: 301: // Пішін деректерін алыңыз. 302: $деректер = $this->input->post->get("пайдаланушы", массив(), "массив");

Сондықтан, сұраудағы барлық параметрлердің атауларын j-дан user-ге өзгертеміз.

Біздің үшінші қадамымыз - жарамды CSRF таңбалауышын табу, өйткені онсыз тіркеу болмайды.

  • /components/com_users/controllers/user.php: 296: JSession::checkToken("жазба") немесе jexit(JText::_("JINVALID_TOKEN"));

Бұл MD5 хэшіне ұқсайды және оны, мысалы, /index.php/component/users/?view=login сайтындағы авторизация пішінінен алуға болады.


Енді сіз қалаған әдісті пайдаланып пайдаланушыларды жасай аласыз. Егер бәрі ойдағыдай болса, құттықтаймыз - сіз жай ғана осалдықты пайдаландыңыз CVE-2016-8870«Жаңа пайдаланушыларды тіркеуге рұқсат тексеруі жоқ».

UsersControllerRegistration контроллерінің «жұмыс істейтін» регистр() әдісінде ол келесідей көрінеді:

  • /components/com_users/controllers/registration.php: 113: // Тіркеу өшірілсе - кіру бетіне қайта бағыттау. 114: егер (JComponentHelper::getParams("com_users")->get("allowUserRegistration") == 0) 115: ( 116: $this->setRedirect(JRoute::_("index.php?option=com_users&view=" логин", false)); 117: 118: қайтару жалған; 119: )

Сонымен осал жерлерде:

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

Иә, мүмкін емес.

Екінші, әлдеқайда күрделі мәселені түсіну үшін біз жасаған сұранысты жіберіп, кодтың әртүрлі бөліктерінде оның қалай орындалатынын көрейік. Міне жұмысшы әдісінде пайдаланушы жіберген деректерді тексеруге жауапты бөлік:

Жалғасы тек мүшелерге ғана қолжетімді

1-нұсқа. Сайттағы барлық материалдарды оқу үшін «сайт» қауымдастығына қосылыңыз

Белгіленген мерзімде қауымдастыққа мүше болу сізге БАРЛЫҚ Hacker материалдарына қол жеткізуге мүмкіндік береді, жеке жинақталған жеңілдіктеріңізді арттырады және кәсіби Xakep Score рейтингін жинауға мүмкіндік береді!

Бір уақытта бірнеше сайттар үшін бір WordPress қондырғысын пайдалануға мүмкіндік береді. Бұл жағдайда әрбір сайт дерекқорда бірегей префиксі бар өз кестелерін алады.

Тіркелген пайдаланушылардың деректері бар кестелер желідегі барлық сайттарға ортақ. Бұл белгілі бір плюс және бір рет тіркелу арқылы сіз бірнеше сайттарға қол жеткізе аласыз. Сонымен қатар, әр сайтта бір есептік жазба әртүрлі құқықтарға ие болуы мүмкін. Мысалы, бір сайтта пайдаланушы редактор, ал екіншісінде әкімші болуы мүмкін.

Әдеттегі WordPress орнатуында тіркеу, логин және құпия сөзді қалпына келтіру беті wp-login.php файлы арқылы шығарылады.

  • wp-login.php - авторизация
  • wp-login.php?action=register - тіркеу
  • wp-login.php?action=lostpassword - құпия сөзді қалпына келтіру

Көп сайт режимінде WordPress өзегі сәл басқаша әрекет ете бастайды және wp-login.php?action=register сілтемесін орындаған кезде wp-signup.php сайтына қайта бағыттау орын алады. Бұл әдепкі бойынша WordPress-пен бірге келетін желіні тіркеу беті.

Кәдімгі пайдаланушы тіркелгілерін тіркеуден басқа, суперәкімші бұл мүмкіндікті желі параметрлерінде (Желі әкімшісі → Параметрлер → Желі параметрлері) қосқан болса, онда жаңа веб-сайт жасай аласыз.

Көптеген тақырыптарда тіркеу беті өте жақсы көрінбейді. Көптеген тақырыптар беттердегі әртүрлі элементтерді стильдеу үшін Bootstrap сияқты CSS шеңберлерін және өздерінің жеке сыныптарын пайдаланады, сондықтан барлығына сәйкес келетін бір HTML жазу қиын.

Бірақ бет ретсіз болып көрінсе, үмітіңізді үзбеңіз. wp-signup.php файлы алдымен сайттың әрбір детальімен жұмыс істеуге уақытыңыз болмаған кезде тамаша нәрсе - сіз басқа маңызды беттер мен мазмұнға назар аудара аласыз.

Жеке тіркелу парағын жасауға дайын болғанда, wp-signup.php WordPress пайдаланушы енгізуін өңдеуге және тексеруге және жаңа тіркелгілерді жасауға мүмкіндік беретін мүмкіндіктер ауқымын түсінуге көмектесетін жақсы үлгі болып табылады.

Желінің негізгі сайты

Әдепкі бойынша WordPress желінің негізгі доменінде (сайтында) тіркеу бетін (wp-signup.php) ашады. Дегенмен, желіңіздегі әрбір сайт үшін, тіпті олардың тақырыптары болса да, тіркеу беттерін жасауға болады.

Біз желідегі барлық сайттар бір тақырыпты пайдаланатын жағдайды қарастырамыз, бірақ олардың әрқайсысында тіркеу беті бар. Сайттардың тілі (ағылшын және орыс) бойынша ерекшеленеді, сондықтан тіркеу беті сайттың «ана» тілінде көрсетіледі. Егер сайттар әртүрлі тақырыптарды пайдаланатын болса, бәрі олардың қандай тақырыптар екеніне, бірдей орналасу оларға сәйкес келетініне (барлық тақырыптарыңызды біріктіруге итермелейтін тамаша жағдай) немесе беттерді жеке әзірлеуге тұрарлық па байланысты болады.

functions.php балама

Файл тәртібі

MU плагиндері кез келген файлдар санын және сізге қисынды болып көрінетін құрылымды қамтуы мүмкін. Мен осы иерархияға ұқсас нәрсені ұстанамын:

| mu-plugins | | load.php | | selena-желі | | | тіркелу | | | | plugin.php | | | ... | | | jetpack | | | | plugin.php

load.php файлында аудармалар мен барлық қажетті «плагиндер» бар:

// MU плагиндері үшін аудармалар жүктелуде load_muplugin_textdomain("selena_network", "/selena-network/languages/"); // Тіркеу бетінің функционалдығы WPMU_PLUGIN_DIR талап етеді. "/selena-network/signup/plugin.php"; // Басқа плагин // WPMU_PLUGIN_DIR қажет ...

Плагин қалталары selena-network каталогында сақталады. Әрқайсысының өз plugin.php бар, біз оны load.php ішіне қосамыз. Бұл сізге төтенше жағдайда жұмыс жобасындағы жеке құрамдас бөліктерді бірден өшіру және қосу икемділігі мен мүмкіндігін береді.

Тіркеу парағы

Кодты қайда және қалай жазатынымызды анықтай отырып, біз тіркеу бетін құруға көшеміз.

Қалыпты интерфейс арқылы example.org/signup/ мекенжайы бар бетті жасайық. Жобаңызға сәйкес келетін кез келген URL мекенжайын пайдалануға болады.

Қажетті тіркеу бетіне қайта бағыттаңыз

WordPress біздің жаңа тіркеу бетіміз туралы біліп, оған қайта бағыттау үшін «Тіркеу» сілтемесін басқан кезде wp_signup_location сүзгісі пайдаланылады. Оны wp-login.php ішінен табуға болады және әдепкі бойынша wp-signup.php сайтына қайта бағыттауға жауапты.

"Register" жағдайы: егер (is_multisite()) ( wp_redirect(apply_filters("wp_signup_location", network_site_url("wp-signup.php")))); exit; // ...

Естеріңізде болса, әдепкі бойынша тіркеу беті желінің негізгі доменінде ашылады. Сондықтан мұнда network_site_url() пайдаланылады.

Ағымдағы сайттағы тіркеу бетінің мекенжайын қайтаратын mu-plugins/selena-network/signup/plugin.php ішіндегі сүзгіге өңдеушімізді қосамыз:

Функция selena_network_signup_page($url) ( home_url("тіркелу"); ) add_filter("wp_signup_location", "selena_network_signup_page", 99);

selena_network - соқтығысуды болдырмау үшін сайтымдағы MU плагиндеріндегі барлық функциялардың атауларында қолданатын префикс, оны өзіңіздің бірегей префиксіңізбен ауыстыру керек. Сүзгіні қосудың басымдығы 99 болып табылады, себебі кейбір плагиндер, мысалы, bbPress және BuddyPress бұл мекенжайды өз беттерімен қайта жаза алады (MU плагиндері әдеттегі плагиндерге қарағанда ертерек жүктеледі, жоғарыдан қараңыз).

home_url() қолданылғанын ескеріңіз, ол network_site_url() түрінен айырмашылығы желінің негізгі сайтын емес, ағымдағы сайттың мекенжайын қайтарады.

wp-signup.php функционалдығы

wp-signup.php файлында көптеген функциялар мен кодтар бар. Үлкен суретті көру үшін кодты бүктеуді пайдалануға болады. Әдетте, бұл ағылшын тілінде «кодты бүктеу» деп аталады.

Файлдың ең басында 1-ден 80-ге дейінгі жолдар (4.1.1 нұсқасында) әртүрлі тексерулер орындалады және get_header() көмегімен беттің «бастауы» шығарылады.

Әрі қарай, көптеген әдістер жарияланады және олармен жұмыс істеуді бастамас бұрын, әрбір функцияның не істейтінін түсінген жөн. Олардың көпшілігі wpmu_ префиксі бар басқа функцияларды жиі пайдаланады, олардың барлығы wp-includes/ms-functions.php файлында жарияланған. Бұл бөлімді кодты көрмей түсіну қиын. Төменде қандай да бір қиындықтар туындаған жағдайда негізгі функциялардың қысқаша сипаттамасы берілген.

  • wpmu_signup_stylesheet() - тіркеу бетінде қосымша CSS шығарады.
  • show_blog_form() - сайтты тіркеуге арналған өрістер (мекен-жайы, аты, іздеу жүйелері үшін көріну).
  • validate_blog_form() - wpmu_validate_blog_signup() арқылы енгізілген сайт мекенжайы мен тақырыбын тексереді.
  • show_user_form() - пайдаланушыны тіркеуге арналған өрістер (логин және электрондық пошта мекенжайы).
  • validate_user_form() — енгізілген логин мен электрондық пошта мекенжайын тексеру. wpmu_validate_user_signup() арқылы пошта.
  • signup_another_blog() - сайтта бұрыннан тіркелген пайдаланушылар үшін show_blog_form() арқылы жаңа сайттарды тіркеуге арналған өрістер.
  • validate_another_blog_signup() - validate_blog_form() арқылы торап мекенжайы мен тақырыбын тексереді.
  • signup_user() – тіркеу бетінің өрістерін көрсетуге арналған негізгі функция.
  • validate_user_signup() - логин мен электрондық пошта мекенжайын тексереді. validate_user_form() арқылы пошта.
  • signup_blog() - show_blog_form() көмегімен сайттың мекенжайын, атын және көрінуін енгізуге арналған өрістер (екінші тіркеу қадамы).
  • validate_blog_signup() – логинді, электрондық пошта мекенжайын тексереді. электрондық пошта, мекенжай және веб-сайт атауы.

wp-signup.php файлының ең төменгі жағында (4.1.1 нұсқасындағы 646 жолдан) жоғарыда сипатталған барлық әдістерді қолданатын тіркеу бетінің негізгі логикасы орналасқан. Кодтың бұл бөлігі функцияға қосылмаған. Соңында get_footer() шақырылады.

wp-signup.php функционалдығын көшіріңіз

Төменде wp-signup.php файлын MU плагиндеріне көшіру және «айырға» өзгертулер енгізу процедурасы сипатталады. Бұл барудың ең жақсы жолы сияқты көрінбеуі мүмкін. Оның орнына, кәдімгі функцияларды емес, сыныптарды пайдаланып пішіндерді тексеру және көрсету үшін өз функцияларыңызды нөлден бастап жаза аласыз. Менің ойымша, wp-signup.php сайтында біздің парақ үшін барлық қажетті логика бар, тек кішкене өзгерістер енгізу ғана қалады.

WordPress жаңартылған кезде, wp-signup.php де мезгіл-мезгіл өзгереді, бірақ бұл әр шығарылыммен «шанышқыңызды» синхрондау керек дегенді білдірмейді. wp-signup.php ішіндегі функциялар негізінен тек HTML шығысымен, деректерді тексерумен, тіркелгілер мен сайттарды жасаумен және ms-functions.php ішінде жарияланған wpmu_ префиксі бар әдістермен айналысады.

Беттегі тіркеу формасын көрсететін функцияны жасайық. Ол үшін wp-signup.php файлын WordPress түбірінен mu-plugings/selena-network/signup/ ішіне көшіріңіз. Оны mu-plugins/selena-network/signup/plugin.php) ішіне қосайық.

WPMU_PLUGIN_DIR талап етеді. "/selena-network/signup/wp-signup.php";

Көшірілген файлдың басынан бастап барлық қажетті және қажет емес тексерулерді алып тастаймыз. 4.1.1 нұсқасында бұл 1-ден 80-ге дейінгі барлық кодтар.

Енді біз тіркеу формасын көрсету үшін негізгі функцияны жасауға дайынбыз. Ол үшін 646-жолдан файлдың ең соңына дейін барлық логиканы selena_network_signup_main деп аталатын функцияға тасымалдаймыз. Ең соңында біз екі қосымша жабуды алып тастаймыз

(722 және 723-жолдар), сондай-ақ get_footer() шақыруы.

Жаңадан жасалған selena_network_signup_main() ішінде біз ең басында осы файлдағы барлық басқа әдістермен пайдаланылатын жаһандық active_signup айнымалысын жариялаймыз. Біз файлдың басынан бастап алып тастаған бұрын_тіркелу_формасына қоңырауды қосамыз.

selena_network_signup_main() функциясы ( жаһандық $active_signup; do_action("тіркелуге_бұрын"); // ... )

Енді барлық қажетті орындарда макетті өзгерту ғана қалады және тіркеу беті дайын.

Тіркеу формасының шығысы

Мұнда кем дегенде екі нұсқа бар. Ыңғайлы әдіс - қысқа кодты жасау және оны қарапайым редактор арқылы бетке орналастыру.

// Network_signup add_shortcode қысқа кодын жасау("желілік_тіркеу", "selena_network_signup_main");

Екінші опция - еншілес тақырып қалтасында page-signup.php бет үлгісін жасау. «Тіркелу» сөзінің орнына сіз бетке тағайындалған бірегей идентификаторды пайдалана аласыз. Үлгінің ішіне қажетті орналасуды қосыңыз және дұрыс жерде selena_network_signup_main() деп атаңыз.

Нәтижесінде менің тіркеу парағы әлдеқайда жақсы және таза болды.

Белсендіру беті

Әдепкі бойынша WordPress тіркеу процесін Multisite-ге екі қадамға бөледі - сайттағы пішінді толтыру және электрондық поштаға жіберілген сілтемені басу арқылы тіркелгіңізді белсендіру. Алдыңғы бөлімде жасалған пішінді толтырғаннан кейін WordPress тіркелгіңізді белсендіру үшін қысқа нұсқаулар мен сілтемесі бар электрондық хат жібереді.

WordPress түбірлік каталогында орналасқан wp-activate.php файлы белсендіру бетін көрсетуге жауапты. wp-activate.php файлын да толығымен өзгертуге болады. Процесс wp-signup.php үшін жасаған ісімізге ұқсас.

Қалыпты интерфейс арқылы example.org/activate/ бетін жасайық. Мекенжай үшін сізге сәйкес келетін кез келген URL мекенжайын пайдаланыңыз.

wp-activate.php файлын біздің MU плагиндерімізге көшіріп, оны mu-plugins/selena-network/signup/plugin.php ішіне қосайық.

WPMU_PLUGIN_DIR талап етеді. "/selena-network/signup/wp-activate.php";

Ішінде wp-signup.php сияқты мазмұн көп емес. Файл бір операцияны орындайды - ол дұрыс кілт алынған жағдайда тіркелгіні белсендіреді және қате немесе операцияның сәтті аяқталуы туралы хабарламаны көрсетеді.

Барлық қажет емес тексерулерді алып тастап, WordPress 4.1.1 жүйесінде 1-ден 69-ға дейінгі жолдарды талап етейік. Ең соңында get_footer() шақыруын алып тастаймыз. Біз қалған мазмұнды selena_network_activate_main() функциясына тасымалдаймыз.

Бір қызығы, мұнда WordPress (wp-load.php) жүктелмес бұрын тұрақты WP_INSTALLING жарияланған. Оның болуы WordPress-тің плагиндерді жүктемеуіне әкеледі.

Тіркеу бетіндегідей, қажет болған жағдайда орналасуды түзету ғана қалады. Сондай-ақ көрсетілген хабарламалардың мәтінін өзгертуге болады (бұл жағдайда барлық аудармашы функцияларына MU плагиндерінің мәтіндік доменін қосуды ұмытпаңыз; әдепкі бойынша ол еш жерде орнатылмаған).

Дайын функцияны қысқа код немесе еншілес тақырыптағы бөлек үлгі арқылы алдын ала жасалған бетте пайдалануға болады.

Дұрыс сілтемелері бар белсендіру әріптері

Белсендіру беті дайын, бірақ WordPress бұл туралы білмейді және әлі де wp-activate.php сілтемесі бар белсендіру электрондық хаттарын жібереді. wp-signup.php-тен айырмашылығы, мекенжайды өзгертуге мүмкіндік беретін сүзгі жоқ. Оның орнына дұрыс сілтемелері бар электрондық хаттарды жіберетін өзіңіздің функцияңызды жазуыңыз керек.

Тіркеу бетіндегі пішінді толтырып, жіберген кезде, WordPress wpmu_signup_ шақырады. пайдаланушы() немесе wpmu_signup_ блог() тіркеу түріне байланысты. Екі функция да wp_signups кестесінде тіркелгіні белсендіру кілтін қамтитын қажетті мазмұнмен толтырып, жаңа жазба жасайды.

Содан кейін функцияға байланысты wpmu_signup_ шақырылады пайдаланушы _notification() немесе wpmu_signup_ блог _notification() . Екі функцияның да ұқсас функционалдығы бар - олар белсендіру сілтемесі бар электрондық поштаны жасайды және жібереді, бірақ әртүрлі аргументтерді қабылдайды. Екеуінде де оқиғаны «ұстау» үшін сүзгілер бар.

Егер (! apply_filters("wpmu_signup_user_notification", $user, $user_email, $key, $meta)) қатені қайтарса;

Тіркелгілерді блог жасау арқылы белсендіру үшін:

Егер (! apply_filters("wpmu_signup_blog_notification", $domain, $path, $title, $user, $user_email, $key, $meta)) ( қайтару жалған; )

Тек wp_mail() арқылы хаттар жіберілетін өз өңдеушілеріңізді жазу ғана қалады және соңында WordPress белсендіру хатын екі рет жібермеуі үшін false қайтаруды ұмытпаңыз - біреуі сіздікі, екіншісі әдепкі. wp-activate.php сілтемесі бар хат.

Функция selena_network_wpmu_signup_user_notification($user, $user_email, $key, $meta = array()) ( // Хаттың тақырыбын, мәтінін және тақырыптарын жасау // ... // Хатты жіберу немесе жіберу үшін Cron тапсырмасын қосыңыз. letter wp_mail($user_email , wp_specialchars_decode($subject), $message, $message_headers // WordPress белсендіру электрондық поштасын екі рет жібермеуі үшін false мәнін беріңіз add_filter("wpmu_signup_user_notification", "selena_network_0", "selena_signup_0"; ;

Электрондық хаттарды SMTP сервері арқылы жіберсеңіз немесе тіркеулер саны өте көп болса, электрондық поштаны бірден жібермеу туралы ойлануыңыз керек. Оның орнына WordPress Cron арқылы Cron тапсырмаларын қосуға болады.

Біз wp-signup.php және wp-activate.php кіруді жабамыз

Тіркеу және белсендіру беттерін жасағаннан кейін «түпнұсқаларды» жабу қажет болуы мүмкін. Мысалы, тіркеу бетінде толтырылуы тиіс қосымша өрістер болса. Сондай-ақ, көптеген WordPress сайттары спамға тіркеледі.

Егер сіз осы беттерді ашқыңыз келсе, Apache-ден 404 қайтаруын сұрау арқылы екі мәселені бір әрекетте шеше аласыз. Мұны істеу үшін конфигурация файлына немесе .htaccess файлына бірнеше қосымша RewriteRules қосу керек.

RewriteEngine On RewriteBase / # Тұрақты өрнектерді білу ешқашан артық болмайды :) RewriteRule ^wp-signup\.php - RewriteRule ^wp-activate\.php - # BEGIN WordPress # Біз WordPress ережелерін әдепкі бойынша ұстамаймыз :) # .. . # END WordPress

Қорытынды

Интернетте осы және басқа да көптеген WordPress «мәселелеріне» көптеген шешімдер бар. Мысалы, тіркеу және белсендіру беттерін жасау үшін кейбіреулер бастапқы wp-signup.php және wp-activate.php файлдарын қайта жазуды ұсынады. Мұны істеуге болмайды, өйткені WordPress-ті жаңартсаңыз, файлдарға енгізілген барлық өзгерістерді жоғалтасыз, сонымен қатар көмегімен ядроның тұтастығын тексере алмайсыз.

Кез келген қосымшаны, тақырыпты немесе шешімді әзірлеу кезінде WordPress ішінде не болып жатқанын түсінуге аз уақыт жұмсау керек. Бұл үшін көптеген пайдалы жөндеу құралдары бар.

P.S.

Жаңа пайдаланушыларға әртүрлі рөлдерді автоматты түрде тағайындау үшін Multisite User Management плагинін пайдалануға болады.

Мақаланы оқығаннан кейін тіркеу және белсендіру беттерін жасау кезінде сұрақтарыңыз немесе қиындықтарыңыз болса, түсініктеме қалдырыңыз, біз міндетті түрде жауап береміз.

27.03.2015 27.03.2015

WordPress әзірлеушісі. Барлығында тәртіпті және жаңа құралдарды түсінуді жақсы көреді. Symfony құрамдас архитектурасынан шабыттандырылған.

  • Тақырыптар әдетте жұмыс істемейді, бірақ кейде біз әзірлеушілер тақырыбымызды сәл жақсырақ және ыңғайлырақ ету үшін кейбір мүмкіндіктерді енгізуіміз керек.

    Бұл оқулықта біз «плагин аумағы» терминін зерттейміз, сонымен қатар Томас Гриффин жазған фантастикалық құралды пайдалануды үйренеміз: TGM Plugin Activation кітапханасы.

    Тақырыптың функционалдығы: плагин аумағына кіру

    Тақырыптар WordPress веб-сайтының дизайнын өзгертуге арналған. Ең дұрысы, тақырып тек көрнекі аспектіге қатысты болуы керек. Дегенмен, WordPress-тің осы алтын ғасырында плагин әзірлеушілері өз тақырыптарына нарықта бәсекеге қабілетті болып қалуға көмектесетін функционалдық мүмкіндіктерді жиі қосады.

    Бұл плагин аумағына басып кіру. Біз «плагин аумағын» кодтың кейбір функционалдық бөлімдері ретінде қарастыра аламыз. Сайтыңыздың функционалдығын өзгертетін кез келген код бөлігі, егер аталған код WordPress ядросына енгізілмеген болса, плагин ретінде берілуі керек.

    Мен бұған дейін мақалаларымның бірінде «плагин аумағына» арналған негізгі ережені тұжырымдадым:

    Егер мүмкіндік сайттың көрнекі көрсетіліміне қатысты болса, онда оны тақырыпқа қосу керек; егер ол функционалдылыққа қатысты болса, онда ол бөлек плагин ретінде ұсынылуы керек.

    Өте қарапайым ереже. Адамдар әлі де функционалдық биттерді тақырыптарына кодтауға тырысады, бірақ тақырыптық каталогтар (мысалы, WordPress.org немесе ThemeForest) «плагин аумағына» енетін тақырыптарды қабылдамайды. Осылайша, тақырыптардағы функционалдылықты ұсыну біраз қиындыққа айналды.

    Бақытымызға орай, плагин аумағының ережесіне қайшы келмейтін қарапайым шешім бар.

    TGM Plugin белсендіру кітапханасына кіріспе

    TGM Plugin Activation параметрін орнату

    Кодтың ең соңында екі параметрі бар tgmpa() функциясына назар аударыңыз. Екінші параметр $config айнымалысы болып табылады, ол да $plugins сияқты массив болып табылады. Аты айтып тұрғандай, TGM Plugin Activation кітапханасын осы массив арқылы теңшеуге болады. Айнымалы сонымен қатар өзінің опциялар жинағын қабылдайды:

    • id (жол) – тақырыптағы TGM Plugin белсендіру кітапханасы үшін бірегей идентификатор. Бұл өте маңызды: егер басқа плагиндер де TGM Plugin Activation қолданбасын пайдаланса, әртүрлі идентификаторлар ықтимал қайшылықтардың алдын алады.
    • default_path (жол) – тақырыптағы плагиндер үшін әдепкі абсолютті жол. Оны орнатқаннан кейін zip файлының атын плагин үшін бастапқы параметр мәні ретінде пайдалануға болады.
    • мәзір (жол) – плагинді орнату бетіне арналған мәзір слогы.
    • has_notices (логикалық) – шын мәніне орнатылса, қажетті/ұсынылған плагиндер үшін әкімші хабарландырулары шығарылады.
    • dismissable (логикалық) – шын мәніне орнатылса, пайдаланушы хабарландыруларды «жібере» алады.
    • dismiss_msg (жол) – егер рұқсат етілмейтін опция жалған күйге орнатылса, бұл хабар әкімші ескертуінің үстінде көрсетіледі.
    • is_automatic (логикалық) – шын мәніне орнатылған болса, плагиндер пайдаланушы оларды орнатуға келіскеннен кейін іске қосылады.
    • хабарлама (жол) – плагиндер кестесінің алдындағы қосымша HTML шығысы.
    • жолдар (массив) – көрсетілетін хабарламаларды қамтитын массив. Оларды аударылған жолдар ретінде көрсетуге болады. Барлық хабарлардың толық тізімін көру үшін example.php файлын қараңыз.
    "mytheme-tgmpa", // бірегей TGMPA идентификаторыңыз "default_path" => get_stylesheet_directory() . "/lib/plugins/", // әдепкі абсолютті жол "menu" => "mytheme-install-required-plugins", // мәзір слогы "has_notices" => шын, // "ажырату" әкімші ескертулерін көрсету => жалған , // ескертулер өшірілмейді "dismiss_msg" => "Маған бұл плагиндерді орнату керек, жарай ма?", // бұл хабар "is_automatic" => true, // автоматты түрде шығарылады. "хабарлама" => " орнатқаннан кейін плагиндерді белсендіріңіз", // плагиндер кестесінің алдынан шығатын хабарлама "strings" => array(); // TGM Plugin Activation қолданбасы пайдаланатын хабарлама жолдарының жиымы); ?>

    Қорытынды

    Көріп отырғаныңыздай, WordPress тақырыптарында функционалдылықты ұсынуға болады - алдымен бір тақырыптан екіншісіне ауысуы мүмкін пайдаланушылар туралы ойлану керек. TGM Plugin Activation кітапханасы мұны істеудің шынымен ақылды әдісін ұсынады.

    Бұл құрал туралы не ойлайсыз? Сіз қолданып көрдіңіз бе, болашақта қолдану ойыңызда бар ма? Ойларыңызбен бөлісіңіз!

    Біз стандартты wp-signup.php орнына көп сайт үшін жеке тіркеу бетін жасаймыз.

    Әдеттегі WordPress орнатуында тіркеу беті (логин, құпия сөзді қалпына келтіру) wp-login.php файлы арқылы шығарылады.

    • /wp-login.php - авторизация
    • /wp-login.php?action=register - тіркеу
    • /wp-login.php?action=lostpassword - құпия сөзді қалпына келтіру

    wp-login.php ішінде көп сайт үшін бөлек шарттар бар. Сонымен, көп сайтта /wp-login.php?action=register сілтемесін орындаған кезде, WordPress /wp-signup.php бетіне қайта бағыттайды. Көптеген тақырыптар бетті өте тартымды етіп көрсетпейді, сондықтан біз өз бетімізше жасаймыз.

    Желінің негізгі сайты

    Әдепкі бойынша WordPress желінің негізгі доменінде (сайтында) тіркеу бетін (wp-signup.php) ашады. Дегенмен, әртүрлі тақырыптар болса да, желіңіздегі әрбір сайт үшін жеке тіркеу бетін жасауға болады. Біз желідегі барлық сайттардың жеке тіркеу беті бар, бірақ бір тақырып қолданылған және сайттар тек тілде ғана ерекшеленетін жағдайды қарастырамыз. Егер сіз әртүрлі тақырыптарды пайдалансаңыз, сізге көбірек код жазу керек болады.

    functions.php?

    Жоқ. Бұл файл атауы WordPress туралы әрбір мақалада айтылған сияқты. Біздің жағдайда, тіркеу функционалдығы бірнеше сайттарға арналғанын ескере отырып, оны кез келген сайт ашылған кезде жүктелетін MU плагиндеріне қосу мағынасы бар.

    Лирикалық шегіну

    Айта кету керек, MU плагиндері кәдімгі плагиндер алдында және WordPress өзегі толық жүктелмей тұрып жүктеледі, сондықтан кейбір функцияларды шақыру PHP-де өлімге әкелетін қателерге әкелуі мүмкін. Мұндай «ерте» жүктеудің де артықшылықтары бар. Мысалы, кез келген тақырыптың ішінде сіз функциялар.php файлы тақырыптан жүктелмес бұрын іске қосылған кейбір әрекеттерге тіркей алмайсыз. Бұған мысал ретінде jetpack_module_loaded_related-posts пішінінің Jetpack плагиніндегі әрекеттерді келтіруге болады (қатысты хабарламалар - модульдің атауы), олардың көмегімен Jetpack модульдерінің белсенділігін бақылауға болады. Бұл әрекетке тақырып файлынан «тіркеу» мүмкін емес, себебі әрекет тақырып жүктелмес бұрын іске қосылды - плагиндер тақырыптар алдында жүктеледі. Сіз WordPress жүктеу ретінің жалпы суретін кодекстегі Әрекет туралы анықтама бетінде көре аласыз.

    Файл тәртібі

    MU плагиндері сізге қисынды болып көрінетін файлдардың және кез келген құрылымның кез келген санын қамтуы мүмкін. Мен осы иерархияға ұқсас нәрсені ұстанамын:

    |-mu-plugins |-|-load.php |-|-|-selena-желі |-|-|-|-тіркеу |-|-|-|-|-plugin.php |-|-|-| -|-... |-|-|-|-jetpack |-|-|-|-|-plugin.php

    load.php файлында желіге қажетті барлық «плагиндер» бар:

    // Барлық қосымшалар үшін Translates жүктеу load_muplugin_textdomain («selena_network», «/selena-network/languages/»); // Желіге тіркелу үшін WPMU_PLUGIN_DIR қажет. "/selena-network/signup/plugin.php"; // Басқа плагиндер // WPMU_PLUGIN_DIR қажет ...

    Selena-желілік қалтаның ішінде плагин қалталары сақталады, олардың әрқайсысында өз plugin.php бар, біз оларды load.php ішіне қосамыз. Бұл сізге икемділік пен заттарды жылдам өшіру және қосу мүмкіндігін береді.

    Тіркеу бетінің мекенжайы

    Тіркеу бетінің мекенжайын көрсету үшін wp_signup_location сүзгісін пайдаланыңыз. Оны wp-login.php файлының ішінен табуға болады және wp-signup.php файлына қайта бағыттауға жауапты.

    Case "register" : if (is_multisite()) ( wp_redirect(apply_filters("wp_signup_location", network_site_url("wp-signup.php")))); exit;

    Функциямызды mu-plugins/selena-network/signup/plugin.php ішіне қосайық, ол ағымдағы сайттағы тіркеу бетінің мекенжайын қайтарады:

    selena_network_signup_page ($url) функциясы ( home_url мекенжайына қайтару () . "/signup/"; ) add_filter ( "wp_signup_location", "selena_network_signup_page", 99);

    selena_network - соқтығысуды болдырмау үшін сайтымдағы MU плагиндеріндегі барлық функциялардың атауларында қолданатын префикс, оны өзіңіздің бірегей префиксіңізбен ауыстыру керек. Сүзгіні қосудың басымдығы 99 болып табылады, себебі кейбір плагиндер, мысалы, bbPress және BuddyPress, бұл мекенжайды өз беттерімен қайта жаза алады (MU плагиндері әдеттегі плагиндерге қарағанда ертерек жүктеледі, жоғарыдан қараңыз). Келушіні бір доменде ұстау үшін network_site_url() орнына home_url() пайдаланылатынын ескеріңіз. Мекенжай ретінде кез келген URL мекенжайын пайдалануға болады.

    Бетті құру

    Енді қалыпты интерфейс арқылы site.com/signup/ мекенжайы бар бетті жасайық, ал еншілес тақырып қалтасында біздің жаңа бетіміздің үлгісі page-signup.php болып табылады. «Тіркеу» сөзінің орнына бірегей идентификаторды пайдалануға болады.

    Жаңа үлгінің ішінде тіркеу пішінін көрсететін selena_network_signup_main() функциясына қоңырау шалу керек.

    Айта кету керек, бүкіл үлгі процесі міндетті емес және оның орнына selena_network_signup_main() функциясын шақыратын өзіңіздің қысқа кодыңызды жасай аласыз.

    wp-signup.php және wp-activate.php

    Енді тіркеу формасын көрсететін функцияны жасайық. Ол үшін wp-signup.php және wp-activate.php файлдарын WordPress түбірінен mu-plugings/selena-network/signup/ ішіне көшіріңіз (және оларды mu-plugins/selena-network ішіне қосуды ұмытпаңыз. /signup/plugin.php). Файлдармен әрі қарай манипуляцияларды сипаттау өте қиын және ұзақ, сондықтан оларды өзіңіз орындауға тура келеді. Мен нақты не істеу керектігін сипаттаймын және жобамның бастапқы файлдарын жариялаймын:

    1. Файлдың басында барлық талапты, функция шақыруларын және функциялардан тыс басқа кодтарды алып тастаңыз.
    2. Атауларға бірегей префикстер қосу арқылы барлық функциялардың атын өзгертіңіз.
    3. wp-signup.php кодының төменгі бөлігін selena_network_signup_main функциясына орап, ең басында жаһандық $active_signup деп жазыңыз; .
    4. Орналасуды дұрыс жерлерде өзіңіздікімен ауыстырыңыз.

    wp-activate.php ішінде шамамен бірдей нәрсені істеу керек:

    1. Функциялардан тыс барлық кодты алып тастаңыз, орналасуды бөлек функцияға ораңыз.
    2. Қажетті жерлерде орналасуды өзгертіңіз.

    wp-activate.php файлы тіркелгіні белсендіру бетіне жауапты. Тіркеу бетіндегі сияқты, оған бөлек үлгі жасау керек, оның ішінде wp-activate.php файлынан функцияны шақыру керек.

    Белсендіру хаттарын жіберу

    Тіркеу беті кірушіге тіркелгісін белсендіру сілтемесі бар электрондық хат жібереді. Әдепкі бойынша, бұл ms-functions.php файлындағы wpmu_signup_user_notification() функциясы арқылы орындалады. Сіз өзіңіздің функцияңыз үшін оның функционалдығын қарызға ала аласыз. Бұл мүмкіндікті пайдаланудан аулақ болудың себебі - ол wp-activate.php сайтынан есептік жазбаны белсендіру сілтемесін жібереді. Сіз бұл функцияны wpmu_signup_user_notification сүзгісін қолданып, оны жалған деп қайтара аласыз (егер бұл жасалмаса, белсендіру хаты екі рет жіберіледі, жақсы, шын мәнінде екі түрлі әріп).

    armyofselenagomez_wpmu_signup_user_notification($user, $user_email, $key, $meta = array()) ( // ... // wpmu_signup_user_notification() функциясының коды wp_mail($user_email, wp_specialchars_decode($subject, $subjecters) ; return false; ) add_filter("wpmu_signup_user_notification", "armyofselenagomez_wpmu_signup_user_notification", 10, 4);

    Нәтижесінде, Selena тақырыбындағы тіркеу парағы әлдеқайда таза және ұқыпты көріне бастады.

    Қорытынды

    Интернетте дәл осындай әрекетті орындаудың көптеген басқа да дұрыс емес тәсілдері бар - Apache бағыттаулары, Java Scriptсіз жұмыс істемейтін AJAX пішіндері және т. өз веб-сайтымда мүмкін.

    Болашақта WordPress wp-signup.php және wp-activate.php файлдарын өзгертсе, салыстыру оңайырақ болуы үшін файлдарды мұқият өңдеп, түпнұсқадан көп ауытқымауға тырысу керектігін ескертемін. өзгерістерді табу үшін оларды бір-бірімен.

    Код ішінде не және қалай болып жатқанын толық түсіну үшін жоғарыда сипатталған барлық функциялардың бастапқы кодын қарауды ұмытпаңыз.

    Бонус. Спам жіберушілерден қорғау

    Тіпті ең кішкентай WordPress сайттары жиі спам тіркелулерінен зардап шегеді. Сіз боттарды сүзуге арналған шексіз шарттарды жаза аласыз, көбінесе жасанды интеллект жасау әрекеті сияқты :) Мультисайт жағдайында Apache-дегі тұрақты қайта бағыттау маған көп көмектесті, оның көмегімен мен ашу кезінде 404 сұрадым. wp-signup.php және /wp-acitvate.php (Мен Apache конфигурациялау бойынша сарапшы емеспін, сондықтан менің ережелерім дұрыс болмауы мүмкін).

    RewriteEngine RewriteBase / RewriteRule ^wp-signup\.php - RewriteRule ^wp-activate\.php - # BEGIN WordPress # Біз WordPress ережелеріне әдепкі бойынша қол тигізбейміз :) # ... # END WordPress

    P.S. Мен үшінші тараптың кейбір нәрселерін мүмкіндігінше егжей-тегжейлі сипаттауға тырысамын, өйткені мен бастаған кезде кейде көп нәрсені ұсынатын және түсіндіретін ешкім болмады. Сондай-ақ, басқа материалдардағы осындай шағын кеңестер біреуді жаңа нәрсені үйренуге және білім аясын кеңейтуге ынталандырады деп ойлаймын. RewriteRule жазбалары тұрақты өрнектерді пайдаланады, олар мүлде күрделі емес, мысалы, ^ символы жолдың басын білдіреді.

    Плагин іске қосылғанда іске қосылатын функцияны тіркейді.

    Бұл функция көрсетілген кері шақыру функциясын activate_(plugin) ілгегіне тіркейді және сол ілмек үшін орауыш болып табылады.

    activate_(plugin) ілгегіндегі (плагин) негізгі плагин файлына қатысты жолдың атымен ауыстырылады. Мысалы, егер плагин орналасқан болса: wp-content/plugins/sampleplugin/sample.php, онда ілмектің аты: activate_sampleplugin/sample.php болады.

    3.1 нұсқасынан бастап. Ілмек плагинді белсендіру кезінде ғана іске қосылады және плагинді автоматты жаңарту кезінде іске қосылмайды.

    Бұл қалай жұмыс істейді

    Плагин activate_plugin() функциясы арқылы іске қосылады, онда activate_(plugin) ілгегі іске қосылады.

    Ядродағы activate_plugin() функциясы VI ортасы жүктелгеннен кейін шақырылады. Бұл функция негізгі плагин файлын (және онда көрсетілгендердің барлығын) қосады, содан кейін көрсетілген кері шақыру функциясын ілмек арқылы іске қосады. Осыған байланысты плагиннің барлық функциялары мен сыныптары біздің кері шақыру функциямызда қол жетімді. Бірақ, VI ортасы жүктелген кезде барлық негізгі WP ілгектер әлдеқашан іске қосылғандықтан, ілмектерге ілінген ешбір плагин оқиғалары, мысалы plugins_loaded, негізгі плагин файлы қосылған кезде енді іске қосылмайды. Бұл біздің плагин қосылатынын білдіреді, бірақ толық емес: ол әлдеқашан іске қосылған кезде қосылуы тиіс емес.

    Мәселен, мысалы, плагин plugins_loaded оқиғасы кезінде бірдеңе жасаса, плагин іске қосылғанда бұл әрекеттердің барлығы орындалмайды. Мысалы, егер ол аударма файлын қамтыса, register_activation_hook() үшін көрсетілген кері шақыру функциясы іске қосылған кезде аударма файлы қосылмайды.

    Әдетте, кері шақыру функциясы іске қосылғаннан кейін функцияларды қосуға болатын 2 оқиға болады: activated_plugin және shutdown.

    Плагинді белсендіру кезінде қызықты нәрсе жасау үшін 5-мысалды қараңыз.

    Қолдану ережелері

    Кейбір ілмек іске қосылғанда шақырылса, функция жұмыс істемейді, мысалы plugins_loaded , init . Функцияны тікелей негізгі плагин файлынан шақыру керек. Іске қосу ережелері:

      register_activation_hook() Plugin Name: ... директивасы орналасқан жерде негізгі плагин файлынан шақырылуы керек және plugins_loaded немесе init сияқты кез келген ілмектен шақырылмауы керек.

      Ілмек функциясы ілмекпен бір файлда болуы немесе басқа файлдан алдын ала қосылған болуы керек.

      Экран шығысы (жаңғырық) ілмек функциясында жұмыс істемейді. Өйткені қайта бағыттау орын алады және сіз жаңғырықты көрмейсіз. Бірақ die() пайдалана аласыз.

    1. Жаһандық айнымалылар (бар болса) ілмек функциясынан қол жеткізу үшін анық анықталуы керек.

    Айнымалы аймақ туралы ескертпе

    Плагинді белсендіру кезінде негізгі плагин файлы жаһандық ауқымға кірмейді, бірақ activate_plugin() функциясының ішінде болады. Сондықтан плагиннің қалыпты жұмысында жаһандық болып саналатын айнымалылар жаһандық болмайды.

    Сонымен, register_activation_hook() қызметінде қолданылатын функция, егер сіз оларды осы функцияның ішінде жаһандық деп жариялаған болсаңыз да, жаһандық айнымалы мәндерді көрмеуі мүмкін. Мысалы:

    $myvar = "бірдеңе"; register_activation_hook(__FILE__, "myplugin_activate"); myplugin_activate())( жаһандық $myvar; echo $myvar; // Айнымалы мән "бір нәрсеге" тең емес )

    Осы мүмкіндіктің арқасында жаһандық айнымалылар әрқашан анық көрсетілуі керек. Барлық жаһандық айнымалылар, тіпті айнымалы плагин мәтінінде көрсетілген болса да, жаһандық ретінде анықталуы керек. Тек осы жағдайда сіз оларға кез келген жерде қол жеткізе аласыз. Мысалы:

    Ғаламдық $myvar; // бұл жаһандық айнымалы екенін анық көрсетеді $myvar = "бірдеңе"; register_activation_hook(__FILE__, "myplugin_activate"); myplugin_activate())( жаһандық $myvar; echo $myvar; //> бірдеңе) функциясы

    Ілгектер жоқ.

    Қайтарады

    null. Ештеңені қайтармайды.

    Қолданылуы

    register_activation_hook($файл, $функция); $файл (жол) (міндетті)Плагиннің негізгі PHP файлына апаратын жол, оның ішінде плагиннің өзі. Әдетте PHP сиқырлы тұрақтысы __FILE__ пайдаланылады. $функциясы (жол/массив/лямбда) (міндетті)

    Кері шақыру функциясының атауы. Сыныптар үшін массив пайдаланыңыз: array($this, "функция_аты"); .

    Функция $network_wide логикалық айнымалысын алады - плагин көп сайт жағдайында сайттардың бүкіл желісі үшін белсендірілгеніне қарамастан.

    Мысалдар

    №1. Плагин белсендірілген кезде функцияны іске қосу

    Негізгі плагин файлында my_plugin_activate() функциясы бар делік: wp-content/plugins/myplugin/myplugin.php , содан кейін плагинді белсендіру кезінде бұл функцияны іске қосу үшін келесі кодты пайдаланыңыз:

    Register_activation_hook(__FILE__, "менің_плагинімді_белсендіру"); my_plugin_activate() функциясы ( // Белсендіру коды... )

    №2. Класс әдісін іске қосу

    Егер плагин PHP сыныбын пайдаланса, белсендіру коды келесідей қосылады:

    Register_activation_hook(__FILE__, array("My_Plugin", "install")); класс My_Plugin ( статикалық функция install() ( // Мұнда ешбір шығыс жасамаңыз... ) )

    №3. Бөлек файлдан сынып әдісін іске қосу

    Егер белсендіру функциясы бар сынып бөлек файлда болса, белсендіру функциясын келесідей тіркеңіз:

    Бір рет_қосу __DIR__ . "/class-My_Plugin.php"; register_activation_hook(__FILE__, array("My_Plugin", "on_activate_функция"));

    №4. Класс әдісін сыныптың ішінен іске қосу

    Егер сіз __construct() ішінде болсаңыз. Маңызды, __FILE__ негізгі плагин файлына «қарауы» керек:

    Register_activation_hook(__FILE__, массив($осы, "СІЗДІҢ_ӘДІСІҢІЗ_NAME"));

    #5 Плагинді іске қосқаннан кейін бірден бірдеңе жасаңыз

    Плагинді іске қосқаннан кейін тек екі ілмек іске қосылады: activated_plugin және shutdown .

    Плагинді іске қосқаннан кейін бірден бірдеңе жасау қажет болғанда, оларға функция қосуға болады.

    Бұл шешім қолайлы болмаса, WP опцияларын пайдалануға болады: деректерді опцияға сақтаңыз, содан кейін опцияның бар-жоғын тексеріңіз және опция бар болса, бірдеңе жасаңыз:

    // Негізгі плагин файлы. ... функциясы my_plugin_activate() ( // опцияны қосыңыз, сонда ол бар болса, біз бірдеңе жасай аламыз. add_option("Activated_Plugin", "Plugin-Slug"); // Міне, белсендіру коды... ) register_activation_hook(__FILE__, " my_plugin_activate"); функциясы load_plugin() ( if (is_admin() && get_option("Activated_Plugin") == "Plugin-Slug") ( // енді жұмыс істемейтіндей етіп қосылған опцияны жойыңыз // және не істеу керек... delete_option("Activated_Plugin "); // Плагинді іске қосқаннан кейін бірдеңе орындаңыз // Мысалы: add_action("init", "my_init_function" ) ) add_action("admin_init", "load_plugin");

    Плагинді белсендіру кезінде бірдеңе жасаудың тағы бір нұсқасы - оқиғаңызды келесідей жасау:

    Функция my_plugin_activate())( // Ілмекіңізді плагиннің файлдарынан тіркей алатындай етіп орнатыңыз do_action("my_plugin_activate"); ) register_activation_hook(__FILE__, "my_plugin_activate");

    №6 Функцияны пайдаланудың тағы бір көрсетілімі

    Функцияны қалай пайдалану керектігін көрсететін шағын плагин:

    /* Плагин атауы: Сынақ Сипаттама: Сынақ */ require_once dirname(__FILE__) . "/my_other_file.php"; /* Бұл код жұмыс істемейді. Белсендіру ілгегі негізгі файлдан шақырылуы керек. register_activation_hook (dirname(__FILE__) . "/my_other_file.php", "менің_басқа_функциям"); */ // Бұл жұмыс коды. тіркелу_белсендендіру_ілгегі(__FILE__, "сынау_белсенді"); /* Бұл жаһандық айнымалыларды жариялаудың және оларға қол жеткізудің дұрыс жолы. Жаһандық айнымалылар анық жариялануы керек. Онсыз сіз оларға қол жеткізе алмайсыз. */ ғаламдық $some_var; $some_var = "эй"; // Белсендіру функциясы test_activated())( // мұнда $some_var hey жаһандық $some_var тең болмайды; // Мұнда $some_var hey тең болады // Бұл функция "my_other_file.php" файлында анықталған. my_other_function(); /* Бұл опция жұмыс істемейді, егер сізге журналдарды уақытша файлға жазу қажет болса, белсендіру ілгегі жұмыс істейтінін тексергіңіз келсе, ілмек функциясының ішінде exit() пайдаланыңыз. echo "test_activated шақырылды!";