Если ваш плагин работает с обработкой данных в админке или в публичной части, то он должен проверять права пользователей.
Права и роли пользователей
Очень важно иметь безопасную систему. WordPress предоставляет такую возможность в виде прав и ролей пользователей, распределяю кто и что может делать.
Каждый пользователь во время авторизации в WordPress автоматически получает определенные права в зависимости от его роли.
Роль пользователя — это лишь красивое название для группы пользователя к которой он относится. Каждая группа имеет в себе определенные права.
Например, основные пользователи сайта могут иметь роль «Администратор», когда остальные пользователи могут иметь такие как «Редактор» или «Автор». Вы можете назначать безграничное количество пользователей к роли, например, у вас может быть два пользователя с группой «Администратор».
Права пользователя — это разрешения или права, которые даются каждому пользователю или группе.
Например, у администраторов есть право под названием manage_options
, которая разрешает просматривать, изменять и сохранять опции на сайте. У редакторов таких прав нет и тем самым у них не будет доступа к опциям.
Эти права проверяются во многих местах админ панели. В зависимости от роли — меню, функционал и другие элементы WordPress могут быть добавлены или удалены.
Тем самым, не забывайте проверять права пользователя перед тем как запускать основной код.
Иерархия
Чем выше роль пользователя, тем больше у него прав. Каждая пользовательская роль наследует предыдущие права в иерархическом порядке.
Например, группа «Администратор», которая является самой высокой и создается по умолчанию после свежей установки WordPress, наследует так же следующие роли и права: «Подписчик», «Помощник», «Автор» и «Редактор».
Примеры
Без ограничений
Пример ниже создает ссылку публичной части сайта, которая дает возможность удалять посты. И из-за того, что этот код не проверят права, любой пользователь сайта может удалять посты.
<?php /** * создаем ссылку удаления поста */ function bologer_generate_delete_link($content) { // запускать только в открытом посте if (is_single() && in_the_loop() && is_main_query()) { // добавляем аргументы в запрос: action, post $url = add_query_arg( [ 'action' => 'wporg_frontend_delete', 'post' => get_the_ID(), ], home_url() ); return $content . ' <a href="' . esc_url($url) . '">' . esc_html__('Delete Post', 'bologer') . '</a>'; } return null; } /** * обработчик запроса */ function bologer_delete_post() { if (isset($_GET['action']) && $_GET['action'] === 'wporg_frontend_delete') { // проверить если ли у нас ID поста $post_id = (isset($_GET['post'])) ? ($_GET['post']) : (null); // проверить есть ли у нас пост с таким ID $post = get_post((int)$post_id); if (empty($post)) { return; } // удалить пост wp_trash_post($post_id); // сделать редирект на страницу администратора $redirect = admin_url('edit.php'); wp_safe_redirect($redirect); // завершили die; } } /** * добавить ссылку удаления после текста поста */ add_filter('the_content', 'bologer_generate_delete_link'); /** * зарегистрируем наш запрос в обработчике хука init */ add_action('init', 'bologer_delete_post');
Ограничения на определенные права
Пример выше позволяет любому пользователя нажимать на ссылку «Удалить» и тем самым удалить пост. Но, мы хотим разрешить это действие только «Редакторам» и группы, которые выше совершать это действие.
Для того, чтобы сделать это, нам нужно проверить есть ли у текущего пользователя права edit_others_posts
, которые у групп «Редакторов» и выше должны быть:
<?php /** * создаем ссылку удаления поста */ function bologer_generate_delete_link($content) { // запускать только в открытом посте if (is_single() && in_the_loop() && is_main_query()) { // добавляем аргументы в запрос: action, post $url = add_query_arg( [ 'action' => 'wporg_frontend_delete', 'post' => get_the_ID(), ], home_url() ); return $content . ' <a href="' . esc_url($url) . '">' . esc_html__('Delete Post', 'wporg') . '</a>'; } return null; } /** * обработчик запроса */ function bologer_delete_post() { if (isset($_GET['action']) && $_GET['action'] === 'wporg_frontend_delete') { // проверить если ли у нас ID поста $post_id = (isset($_GET['post'])) ? ($_GET['post']) : (null); // проверить есть ли у нас пост с таким ID $post = get_post((int)$post_id); if (empty($post)) { return; } // удалить пост wp_trash_post($post_id); // сделать редирект на страницу администратора $redirect = admin_url('edit.php'); wp_safe_redirect($redirect); // завершили die; } } if (current_user_can('edit_others_posts')) { /** * добавить ссылку удаления после текста поста */ add_filter('the_content', 'bologer_generate_delete_link'); /** * зарегистрируем наш запрос в обработчике хука init */ add_action('init', 'bologer_delete_post'); }