WordPress стає все більш і більш популярним фреймворком для розробки веб-додатків. У зв’язку з цим знаходиться безліч особливих випадків, які WordPress не охоплює. Ви дійсно хочете, щоб користувачі вашого додатки бачили адмін панель WordPress?

З мого досвіду розробки веб-додатків, відповідь на це питання – «ні».

Сьогодні я збираюся навчити вас, як перенаправити користувача, грунтуючись на його ролі, на персональну сторінку в WordPress.

Почнемо з налаштування

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

Будь-яка функціональність, якій ви хочете зберегти життя після зміни дизайну теми, повинна бути поміщена в плагін.

Створіть нову папку для плагіна в вашому каталозі wp-content/plugins і назвіть її cm-redirect-by-role. Додайте в неї файл з ім’ям cm-redirect-by-role.php. В цей файл ми збираємося додати базовий заголовок плагіна WordPress, наведений нижче:

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

Процес авторизації користувача

За замовчуванням користувач може увійти в обліковий запис на вашому сайті, створеному за допомогою WordPress, через http://yoursite.com/wp-login.php. Коли ви увійшли на сайт через цю посилання, сайт посилає вас в адмін панель WordPress.

Це означає, що адмінка WordPress запущена, і вам потрібно використовувати дію від імені адміна, щоб відловити користувача. Я завжди перехоплюю дію admin_init тоді, коли воно здійснилось достатньо, щоб ви отримали доступ до даних користувача, але не чекаючи моменту, коли користувач побачить що-небудь на панелі інструментів.

Використання дії admin_init означає, що навіть якщо користувачі вже увійшли в свій обліковий запис і намагаються отримати доступ до адмінки WordPress, вони все одно будуть перенаправлені.

Зараз давайте поглянемо на код, який ми збираємося використовувати. В якості прикладу припустимо, що ми хочемо передати всіх передплатників, але можна використовувати цей підхід для будь-якої іншої стандартної або персональної ролі у WordPress:

/**
* Перенаправлення користувачів згідно їх ролі
*
* @since 1.0
* @author SFNdesign, Curtis McHale
*
* @uses wp_get_current_user() Повертає об’єкт WP_User для поточного користувача
* @uses wp_redirect() Перенаправляє користувача за певним адресою
*/
function cm_redirect_users_by_role() {
$current_user = wp_get_current_user();
$role_name = $current_user->roles[0];
if ( ‘subscriber’ === $role_name ) {
wp_redirect( ‘http://yoursite.com/dashboard’ );
} // if
} // cm_redirect_users_by_role
add_action( ‘admin_init’, ‘cm_redirect_users_by_role’ );

Ми запускаємо процес, отримуючи об’єкт нашого поточного користувача за допомогою функції wp_get_current_user(). З цього об’єкта ми витягуємо ім’я нашої ролі і присвоюємо його змінній $role_name.

Потім перевіряємо, чи збігається $role_name з роллю, яку ми хочемо перенаправити. Якщо співпадає, то викликаємо функцію wp_redirect, щоб відправити користувача в вибране місце. Хоча цей код буде працювати, нам потрібно додати ще одну деталь.

Робимо код AJAX безпечним

Виробляючи AJAX виклики в WordPress, вам завжди потрібно звертатися до файлу маршрутизації AJAX, який знаходиться в адмінці WordPress.

Якщо ми залишимо наш код, як він є, будь виклик AJAX, виконаний від імені відповідних ролей, буде провалений, як тільки він пройде перевірку на відповідність умові і буде перенаправлений.

Щоб вирішити цю проблему, ми повинні перевірити, не виконуємо ми на поточний момент AJAX виклик, і якщо так, то пропускаємо перевірку ролі:

function cm_redirect_users_by_role() {
if ( ! defined( ‘DOING_AJAX’ ) ) {
$current_user = wp_get_current_user();
$role_name = $current_user->roles[0];
if ( ‘subscriber’ === $role_name ) {
wp_redirect( ‘http://yoursite.com/dashboard’ );
} // if $role_name
} // if DOING_AJAX
} // cm_redirect_users_by_role
add_action( ‘admin_init’, ‘cm_redirect_users_by_role’ );

Тепер ми помістили нашу функцію перенаправлення всередину перевірки константи DOING_AJAX. Якщо вона визначена – значить ми запустили виклик AJAX і ми хочемо пропустити код перенаправлення.

Висновок

Ось і все, тепер ми можемо перенаправляти користувачів, грунтуючись на їх ролі, на довільну сторінку, по нашому вибору. Ми могли б навіть перенаправляти користувачів з різними ролями на різні сторінки, якщо б захотіли.

Все, що нам потрібно зробити для цього – додати друга умова, відповідне другій ролі, і встановити місце, куди ми б хотіли зробити перенаправлення.

Переклад статті «Redirect Users to Custom Pages by Role» був підготовлений дружною командою проекту Сайтостроение від А до Я.