Інтернет Windows Android

Як створити власну сторінку реєстрації в WordPress Multisite. Висновок форми реєстрації

Створюємо власну сторінку реєстрації для Мультисайт замість стандартної wp-signup.php.

У звичайній установці WordPress сторінку реєстрації (авторизації, скидання пароля) виводить файл wp-login.php.

  • /wp-login.php - авторизація
  • /wp-login.php?action\u003dregister - реєстрація
  • /wp-login.php?action\u003dlostpassword - скидання пароля

Для Мультисайт в wp-login.php є окремі умови. Так, при переході по посиланню /wp-login.php?action\u003dregister на мультісайте, WordPress зробить редирект на сторінку /wp-signup.php. У багатьох темах сторінка виглядає не дуже привабливо, тому ми зробимо свою власну.

Основний сайт мережі

За замовчуванням, WordPress відкриває сторінку реєстрації (wp-signup.php) на основному домені (сайті) мережі. Проте, можна зробити окрему сторінку реєстрації для кожного сайту мережі, навіть якщо у них різні теми. Ми будемо розглядати випадок, коли на всіх сайтах мережі є своя власна сторінка реєстрації, але використовується однакова тема і сайти розрізняються лише мовою. Якщо використовуються різні теми, потрібно написати більше коду.

functions.php?

Ні. Ім'я цього файлу, здається, згадується в будь-якій статті про WordPress. У нашому випадку, з урахуванням того, що функціонал реєстрації розрахований на кілька сайтів, має сенс винести його в MU-плагіни, які завантажуються при відкритті будь-якого сайту.

Ліричний відступ

Варто відзначити, що MU-плагіни завантажуються раніше звичайних плагінів і до повного завантаження ядра WordPress, тому виклик деяких функцій може привести до фатальних помилок в PHP. Подібна «рання» завантаження має і свої плюси. Скажімо всередині будь-якої теми не можна чіплятися до деяких екшенам, які спрацьовують ще до завантаження файлу functions.php з теми. Прикладом цього можуть служити екшени з плагіна Jetpack виду jetpack_module_loaded_related-posts (related-posts - назва модуля) за допомогою яких можливо відстежувати активність модулів в Jetpack. До цього екшену неможливо «причепитися» з файлу теми, тому що екшен вже спрацював до завантаження теми - плагіни завантажуються раніше тем. Поглянути на загальну картинку порядку завантаження WordPress можна на сторінці Action Reference в кодексі.

Порядок в файлах

MU-плагіни можуть містити будь-яку кількість файлів і будь-яку стуктуру, яка здасться вам логічною. Я дотримуюся приблизно такої ієрархії:

| -Mu-plugins | - | -load.php | - | - | -selena-network | - | - | - | -signup | - | - | - | - | -plugin.php | - | - | - | - | -... | - | - | - | -jetpack | - | - | - | - | -plugin.php

У файлі load.php підключаються всі необхідні «плагіни» для нашої мережі:

// Load Traslates for all addons load_muplugin_textdomain ( "selena_network", "/ selena-network / languages \u200b\u200b/"); // Network Signup require WPMU_PLUGIN_DIR. "/Selena-network/signup/plugin.php"; // Another plugins // require WPMU_PLUGIN_DIR ...

Всередині папки selena-network зберігаються папки плагінів, в кожної є свій 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, яка буде віддавати адреса сторінки реєстрації на цьому сайті:

Function selena_network_signup_page ($ url) (return home_url (). "/ Signup /";) add_filter ( "wp_signup_location", "selena_network_signup_page", 99);

selena_network - префікс, який я використовую в іменах всіх функцій всередині MU-плагінів на своєму сайті для уникнення колізій, його слід замінити на свій власний унікальний префікс. Пріоритет додавання фільтра 99, тому що деякі плагіни, наприклад bbPress і BuddyPress можуть перезаписати цю адресу на свій власний (MU-плагіни завантажуються раніше, ніж звичайні плагіни, див. Вище). Зверніть увагу, що використовується home_url (), замість network_site_url (), щоб залишити відвідувача на тому ж домені. В якості адреси можна використовувати будь-який URL.

створення сторінки

Тепер створимо сторінку з адресою site.com/signup/ через звичайний інтерфейс, а в папці дочірньої теми шаблон для нашої нової сторінки - page-signup.php. Замість слова «signup» можна використовувати унікальний ID.

Всередині нового шаблону необхідно виконати виклик функції 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. На початку файлу видалити всі require, виклик функцій і інший код поза функцій.
  2. Перейменувати всі функції, додавши до імен унікальні префікси.
  3. Нижню частину коду wp-signup.php обернути в функцію selena_network_signup_main і в її самому початку написати global $ active_signup; .
  4. Замінити верстку на свою власну в потрібних місцях.

Усередині wp-activate.php необхідно зробити приблизно те ж саме:

  1. Видалити весь код поза функцій, обернути верстку в окрему функцію.
  2. Змінити верстку в місцях, де це необхідно.

Файл wp-activate.php відповідає за сторінку активації облікового запису. Як і зі сторінкою реєстрації для неї необхідно створити окремий шаблон, усередині якого викликати функцію з файлу wp-activate.php.

Відправляємо листи активації

Сторінка реєстрації відправляє відвідувачеві лист з посиланням на активацію облікового запису. За замовчуванням цим займається функція wpmu_signup_user_notification () з файлу ms-functions.php. Її функціонал можна запозичувати для своєї функції. Причина, по якій необхідно відмовитися від використання цієї функції - вона відправляє посилання активації облікового запису з wp-activate.php. «Вимкнути» ж цю функцію можна за допомогою фільтра wpmu_signup_user_notification віддаючи по ньому false (якщо цього не Зробити, лист активації буде відправлятися двічі, окей, насправді два різних листи).

Function armyofselenagomez_wpmu_signup_user_notification ($ user, $ user_email, $ key, $ meta \u003d array ()) (// ... // Код з функції wpmu_signup_user_notification () wp_mail ($ user_email, wp_specialchars_decode ($ subject), $ message, $ message_headers) ; return false;) add_filter ( "wpmu_signup_user_notification", "armyofselenagomez_wpmu_signup_user_notification", 10, 4);

В результаті сторінка реєстрації в темі Селена стала виглядати набагато чистіше і акуратніше.

висновок

В інтернеті безліч інших не надто правильних способів того, як зробити те ж саме - редіректи Apache, AJAX-форми, які не будуть працювати без Java Script і т. П. Все це мені не дуже сподобалося, тому я постарався зробити це максимально правильно на своєму власному сайті.

Зауважу, що правити файли слід обережно і намагатися не сильно відходити від вихідних, щоб в дальнешйем, в разі якщо WordPress змінить файли wp-signup.php і wp-activate.php, їх простіше було порівнювати між собою для пошуку змін.

Не забувайте дивитися в вихідний код всіх описаних вище функцій, щоб повністю розібратися з тим, що і як відбувається всередині коду.

Бонус. Захист від спамерів

Навіть найменші сайти на WordPress часто піддаються нальоту спам-реєстрацій. Можна писати нескінченні умови для фільтрації ботів, часто більше схожі на спробу створити штучний інтелект 🙂 У разі Мультисайт мені дуже допоміг звичайний редирект в Apache, за допомогою якого при відкритті /wp-signup.php і /wp-acitvate.php я попросив видавати 404 (я не експерт з налаштування Apache, тому мої правила можуть бути не дуже правильними).

RewriteEngine On RewriteBase / RewriteRule ^ wp-signup \\ .php - RewriteRule ^ wp-activate \\ .php - # BEGIN WordPress # Правила від WordPress за замовчуванням не чіпаємо :) # ... # END WordPress

P. S. Я намагаюся максимально детально описувати деякі сторонні речі, тому що коли починав я, часом нікому було підказати і пояснити багато речей. Також я вважаю, що подібні невеликі наведення на інші матеріали кого-небудь підштовхнуть до вивчення чогось нового і розширення своєї галузі знань. У записах RewriteRule використовуються регулярні вирази, вони зовсім не складні, наприклад, символ ^ означає початок рядка.

Advertisements

ln [-Ffhinsv] початковий файл [ целевой_файл ] Ln [-Ffhinsv] початковий файл ... целевой_каталог link ісходний_файл целевой_файл програма ln створює запис в директорії (посилання) з ім'ям, целевой_файл. на целевой_файл будуть встановлені ті-ж режими, які стоять на початковий файл. Посилання дозволяють мати кілька копій одного файлу або каталогу, розміщених в різних місцях, але не займаючи при цьому дисковий простір. Існує два типи посилань, жорсткі посилання і символічні посилання. Яким чином посилання вказує на початковий файл, Залежить від типу даної посилання.

Команда ln має наступні опції: -f Якщо целевой_файл вже існує, видалити його, щоб можна було створити посилання. Дана опція скасовує опцію -i. -F Якщо целевой_файл вже існує і є каталогом, видалити його, щоб можна було створити посилання. опція -F використовується разом з опціями -f або -i, В разі, якщо жодна з них не вказана, мається на увазі опція -f. Ця опція не працює без опції -s. -h Якщо целевой_файл або целевой_каталог є символічною посиланням, не повторювати їй. Дана опція корисна в поєднанні з опцією -f для заміни символічного посилання, яка вказує на каталог. -i Інтерактивний режим. якщо целевой_файл існує, користувачеві буде виведений запит на видалення У разі згоди, ln видалить целевой_файл і створить нову посилання. Дана опція скасовує дію опції -f. -n Аналог опції -h, Для сумісності з іншими реалізаціями програми ln. -s Створювати символічне посилання. -v Режим виведення інформації про хід виконання програми ln. За замовчуванням, програмою ln створює жорстка посилання. Жорстка посилання на файл, нічим не відрізняється від вихідного файлу, при цьому зміни зроблені в файлі, що не залежать від імені, за яким до нього було зроблено звернення. Жорсткі посилання, не можуть бути посиланнями на каталоги, а так-же не можуть перебувати за межами даної файлової системи. Символічна посилання містить ім'я файлу, на який посилається. При виконанні операції open(2) над символічною посиланням використовується ориги ний файл. виклик stat(2), виконаний над символічною посиланням, також поверне вихідний файл. Для отримання інформації про заслання можна використовувати lstat(2). Для читання вмісту символічного посилання можна скористатися викликом readlink(2). На відміну від жорстких посилань, символічні, можуть перебувати на інший файлової системи і можуть вказувати на каталоги. З одним або двома аргументами, програма ln створює посилання на існуючий початковий файл. Ім'я для посилання буде взято з аргументу целевой_файл. Якщо в аргументі целевой_файл, Не зазначена директорія для створення посилання, буде використана поточна директорія, якщо вказано тільки каталог, буде створена посилання на останній елемент з початковий файл. З більш ніж двома аргументами, програма ln створює посилання в целевой_каталог на всі зазначені шляху в початковий файл. Посилання при цьому отримують імена вихідних файлів. якщо програма ln, Викликається в формі link, Їй передається рівно два аргументи, що передаються аргументи не можуть бути каталогами, крім того, в цій формі вона не приймає ніяких опцій. Це проста форма використання. сумісність Опції -h, -i, -n і -v, Призначені для сумісності з іншими реалізаціями програми ln, І не рекомендуються для використання в скриптах. опція -F є додатковою для

Дозволяє використовувати одну установку WordPress для декількох сайтів одночасно. При цьому кожен сайт отримує свої власні таблиці в базі даних з унікальним префіксом.

Таблиці з даними зареєстрованих користувачів загальні для всіх сайтів мережі. Це безсумнівний плюс і зареєструвавшись один раз можна отримати доступ до декількох сайтів. Причому на кожному сайті один і той же обліковий запис може мати різні права. Наприклад, на одному сайті користувач може бути редактором, а на іншому адміністратором.

У звичайній установці WordPress сторінку реєстрації, авторизації і скидання пароля виводить файл wp-login.php.

  • wp-login.php - авторизація
  • wp-login.php? action \u003d register - реєстрація
  • wp-login.php? action \u003d lostpassword - скидання пароля

У режимі Multisite ядро \u200b\u200bWordPress починає вести себе трохи інакше і при переході по посиланню wp-login.php? Action \u003d register відбудеться редирект на wp-signup.php. Це сторінка реєстрації вашої мережі, яка за замовчуванням є в WordPress.

Крім реєстрації звичайних користувальницьких акаунтів на ній можна створити і новий сайт, якщо суперадміністратора увімкнув цю функцію в налаштуваннях мережі (Network Admin → Settings → Network Settings).

У більшості тим сторінка реєстрації виглядає не зовсім добре. Багато тем оформлення використовують CSS-фреймворки, наприклад, Bootstrap, і власні специфічні класи для стилізації різних елементів на сторінках, тому важко написати єдиний HTML, який підійде всім.

Але не варто впадати у відчай, якщо сторінка виглядає неохайно. Файл wp-signup.php відмінна річ на перших порах, коли немає часу опрацьовувати кожну деталь сайту - можна зосередитися на інших більш важливих сторінках і контенті.

Коли ви будете готові зробити свою власну сторінку реєстрації, wp-signup.php буде хорошим зразком і прикладом, за яким легко розібратися в спектрі функцій, які надає WordPress для обробки і перевірки введених користувачами даних і створення нових акаунтів.

Основний сайт мережі

За замовчуванням, WordPress відкриває сторінку реєстрації (wp-signup.php) на основному домені (сайті) мережі. Проте, можна створювати сторінки реєстрації для кожного сайту мережі, навіть якщо у них і теми.

Ми будемо розглядати випадок, коли на всіх сайтах мережі використовується одна тема, але на кожному з них є сторінка реєстрації. Сайти розрізняються мовою (англійська та російська), тому сторінка реєстрації буде виводитися на «рідному» мовою сайту. У разі, якщо сайти використовують різні теми, все буде залежати від того, які саме це теми, чи підійде їм однакова верстка (відмінна ситуація, яка може підштовхнути вас до уніфікації всіх своїх тем) або стоїть опрацьовувати сторінки індивідуально.

альтернатива functions.php

Порядок в файлах

MU-плагіни можуть містити будь-яку кількість файлів і структуру, яка здасться вам логічною. Я дотримуюся приблизно такої ієрархії:

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

У файлі load.php підключаються переклади і всі необхідні «плагіни»:

// Завантаження перекладів для MU-плагінів load_muplugin_textdomain ( "selena_network", "/ selena-network / languages \u200b\u200b/"); // Функціонал для сторінки реєстрації require WPMU_PLUGIN_DIR. "/Selena-network/signup/plugin.php"; // Ще один плагін // require WPMU_PLUGIN_DIR ...

Всередині директорії selena-network зберігаються папки плагінів. У кожної є свій plugin.php, які ми і підключаємо в load.php. Це дає гнучкість і можливість миттєво відключати і включати окремі компоненти на робочому проекті в разі екстреної необхідності.

сторінка реєстрації

Розібравшись з тим, де і як ми будемо писати код, можна переходити до створення сторінки реєстрації.

Створимо сторінку з адресою example.org/signup/ через звичайний інтерфейс. В якості адреси можна використовувати будь-який URL, який здасться відповідним для вашого проекту.

Редирект на потрібну сторінку реєстрації

Щоб WordPress дізнався про нашу нову сторінку реєстрації і виробляв редирект саме на неї, якщо клікнути на посилання «Зареєструватися», використовується фільтр 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; // ...

Як ви пам'ятаєте, за замовчуванням, сторінка реєстрації відкривається на основному домені мережі. Саме тому тут використовується network_site_url ().

Додамо свій обробник до фільтру в mu-plugins / selena-network / signup / plugin.php, який буде віддавати адреса сторінки реєстрації на цьому сайті:

Function selena_network_signup_page ($ url) (return home_url ( "signup");) 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 містить велику кількість функцій і коду. Щоб побачити картину в цілому можна скористатися згортанням коду. Як правило, по-англійськи це називається «code folding».

На самому початку файлу з 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 (з рядка 646 у версії 4.1.1) основна логіка роботи сторінки реєстрації, яка використовує всі вище описані методи. Ця частина коди не винесена в функцію. В кінці викликається get_footer ().

Копіюємо функціонал wp-signup.php

Далі буде описана процедура копіювання wp-signup.php в MU-плагіни і внесення змін в «форк». Можливо, це може здатися не найправильнішим шляхом. Замість цього можна з нуля написати свої функції для перевірки і виведення форм використовуючи класи, а не звичайні функції. На мій погляд в wp-signup.php вже є вся необхідна логіка для нашої сторінки, залишається лише внести невеликі зміни.

При оновленні WordPress час від часу змінюється і wp-signup.php, але це не означає що при кожному релізі доведеться синхронізувати свій «форк». Функції всередині wp-signup.php по суті займаються лише висновком HTML, перевіркою даних, створенням облікових записів і сайтів займаються методи з префіксом wpmu_, оголошені в ms-functions.php.

Займемося створенням функції, яка буде виводити форму реєстрації на сторінці. Для цього скопіюємо wp-signup.php з кореня WordPress в mu-plugings / selena-network / signup /. Підключимо його всередині mu-plugins / selena-network / signup / plugin.php).

Require WPMU_PLUGIN_DIR. "/Selena-network/signup/wp-signup.php";

Видалимо з самого початку скопійованого файлу все require і непотрібні перевірки. У версії 4.1.1 це весь код з 1 по 80 рядок.

Тепер ми готові створити головну функцію для виведення форми реєстрації. Для цього всю логіку з рядка 646 і до самого кінця файлу перенесемо в функцію c назвою selena_network_signup_main. В самому кінці видалимо два зайвих закривають

(Рядки 722 і 723), а також виклик get_footer ().

У щойно створеної selena_network_signup_main () на самому початку оголосимо глобальну змінну active_signup, яку використовують всі інші методи з цього файлу. І додамо виклик події before_signup_form, яке ми видалили з самого початку файлу.

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

Тепер залишається лише змінити верстку в усіх місцях де це необхідно і сторінка реєстрації готова.

Висновок форми реєстрації

Тут є як мінімум два варіанти. Більш зручний спосіб - створити шорткод і розмістити його на сторінці через звичайний редактор.

// Створюємо шорткод network_signup add_shortcode ( "network_signup", "selena_network_signup_main");

Другий варіант - створити в папці дочірньої теми шаблон сторінки page-signup.php. Замість слова «signup» можна використовувати унікальний ID, присвоєний сторінці. Всередині шаблону додати необхідну верстку і зробити виклик selena_network_signup_main () в потрібному місці.

В результаті моя сторінка реєстрації стала виглядати набагато краще і чистіше.

сторінка активації

За замовчуванням WordPress умовно ділить процес реєстрації в Multisite на два кроки - заповнення форми на сайті і активація облікового запису при переході по посиланню відправленої в електронному листі. Після того, як ви заповните форму, створену в попередньому розділі, WordPress відправляє лист з невеликою інструкцією і посиланням для активації облікового запису.

За виведення сторінки активації відповідає файл wp-activate.php розташований в кореневій директорії WordPress. wp-activate.php можна так само повністю змінити. Процес схожий з тим, що ми вже робили для wp-signup.php.

Створимо сторінку example.org/activate/ через звичайний інтерфейс. В якості адреси використовуйте будь-який URL, який здасться вам відповідним.

Скопіюємо файл wp-activate.php до себе в MU-плагіни і підключимо його в mu-plugins / selena-network / signup / plugin.php.

Require WPMU_PLUGIN_DIR. "/Selena-network/signup/wp-activate.php";

Всередині не так багато вмісту, на відміну від wp-signup.php. Файл виконує єдину операцію - активує аккаунт, якщо отриманий вірний ключ і виводить повідомлення про помилку або успішне виконання операції.

Видалимо всі непотрібні перевірки і require - з 1 по 69 рядок в WordPress 4.1.1. В самому кінці приберемо виклик get_footer (). Час, що залишився вміст перенесемо в функцію selena_network_activate_main ().

Цікаво зауважити, що тут перед завантаженням WordPress (wp-load.php) оголошувалася константа WP_INSTALLING. Її наявність змушує WordPress не завантажувати плагіни.

Як і у випадку зі сторінкою реєстрації залишається лише виправити верстку там, де це необхідно. Також можна змінити текст виведених повідомлень (в цьому випадку не забудьте додати текстовий домен своїх MU-плагінів в усі функції-перекладачі, за замовчуванням він ніде не встановлено).

Готову функцію можна використовувати на заздалегідь створеній сторінці через шорткод або окремий шаблон в дочірньої темі.

Листи активації з правильними посиланнями

Сторінка активації готова до роботи, але WordPress не знає про неї і як і раніше буде відправляти листи активації з посиланням на wp-activate.php. На відміну від wp-signup.php тут немає фільтра, який би дозволив змінити адресу. Замість цього потрібно написати свою функцію, яка буде відправляти листи з правильними посиланнями.

У момент заповнення і відправки форми на сторінці реєстрації WordPress викликає wpmu_signup_ user() Або wpmu_signup_ blog() В залежності від типу реєстрації. Обидві функції створюють новий запис в таблиці wp_signups заповнюючи її необхідним вмістом, серед якого є і ключ активації облікового запису.

Після, в залежності від функції, викликається wpmu_signup_ user_notification () або wpmu_signup_ blog_notification (). Обидві функції мають схожий функціонал - генерують і відправляють лист з посиланням активації, але приймають різні аргументи. В обох є фільтри для «перехоплення» події.

If (! Apply_filters ( "wpmu_signup_user_notification", $ user, $ user_email, $ key, $ meta)) return false;

Для активації акаунтів зі створенням блогу:

If (! Apply_filters ( "wpmu_signup_blog_notification", $ domain, $ path, $ title, $ user, $ user_email, $ key, $ meta)) (return false;)

Залишається лише написати свої обробники, всередині яких відправляти листи через wp_mail (), а в самому кінці обов'язково віддавати false, щоб WordPress не відправив лист активації двічі - одне ваше, інше - лист за замовчуванням з посиланням на wp-activate.php.

Function selena_network_wpmu_signup_user_notification ($ user, $ user_email, $ key, $ meta \u003d array ()) (// Генеруємо заголовок, текст і заголовки листи // ... // Відправляємо лист або додаємо Cron-завдання для відправлення листа wp_mail ($ user_email , wp_specialchars_decode ($ subject), $ message, $ message_headers); // Віддаємо false, щоб WordPress не відправив лист активації двічі return false;) add_filter ( "wpmu_signup_user_notification", "selena_network_wpmu_signup_user_notification", 10, 4);

Якщо ви відправляєте листи через SMTP-сервер або кількість реєстрацій дуже велике, слід задуматися про те, щоб не відправляти листи миттєво. Замість цього можна додавати Cron-завдання за допомогою WordPress Cron.

Закриваємо доступ до wp-signup.php і wp-activate.php

Створивши свої власні сторінки реєстрації та активації, необхідно буде закрити «оригінали». Наприклад, якщо на сторінці реєстрації є додаткові поля, які необхідно обов'язково заповнити. Також багато WordPress сайти піддаються спам-реєстрацій.

Вирішити дві проблеми одним дією можна попросивши Apache віддавати 404 в разі спроби відкриття цих сторінок. Для цього потрібно лише прописати пару додаткових RewriteRule в ваш файл-конфігурацію ілі.htaccess.

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.