Пользователи в WordPress
Базовая информация которую нужно знать о пользователях WordPress.
Таблица wp_users
- ID(число)
- ID пользователя. Указывается только, если надо обновить данные уже существующего пользователя. Все обязательные параметры, становятся не обязательными.
- user_login(строка) (обязательный)
- Логин нового пользователя. Для дополнительной проверки логина перед созданием/обновлением, можно использовать фильтр: pre_user_login.
- user_pass(строка) (обязательный)
- Пароль для создаваемого пользователя. Хэшируется.
- user_nicename(строка)
- Имя пользователя. Если не указать, будет как логин. Содержит очищенный для использования в URL логин - очищается через sanitize_title(). Например, если при регистрации указать в поле логина email user@example.com, то тут получим userexample-com. Используется в ссылке на архивную страницу автора, поэтому значение поля должно быть уникальным для каждого юзера.
- user_email(строка)
- Почта. Проверяется на существования в БД.
- user_url(строка)
- Сайт. Фильтр: pre_user_url.
- user_registered(DATETIME)
- Дата регистрации. Формат: Y-m-d H:i:s. Если не указано при создании пользователя, то берется текущая дата в диапазоне GMT.
- user_activation_key
- Хэш ключа для восстановления пароля, создается при запросе восстановления. См. get_password_reset_key().
- user_status(не используется)
Это поле больше не используется ядром WordPress, которое раньше использовалось в Мультисайтах при перемещении юзера в спам (этот функционал был удален). Подробнее см. функцию: update_user_status().
Колонку можно использовать как-либо в своих целях, но лучше оставить её в покое.
- display_name(строка)
- Отображаемое имя. Если пусто будет как логин.
Таблица wp_usermeta
Важные мета-данные (мета-поля)
- wp_capabilities(массив)
Роль и права юзера:
a:1:{s:13:"administrator";b:1;}.ВАЖНО! Префикс этой опции
wp_должен совпадать с префиксом таблиц БД$wpdb->prefixили$wpdb->get_blog_prefix()для мультисайта.Так например, если на рабочем сайте изменить префикс таблиц в
wp-config.php, то в этой опции вручную также нужно изменить префикс, иначе все пользователи останутся без прав, потому что после смены префикса, например, наwk_ВП будет искать права в метаполеwk_capabilities.- session_tokens
- Активные сессии. Создаются при входе в аккаунт.
Какие еще данные хранятся в таблице метаданных
- nickname(строка)
- Ник. Если пусто, будет как логин.
- first_name(строка)
- Имя.
- last_name(строка)
- Фамилия.
- description(строка)
- Немного о себе.
- rich_editing(строка/bool)
- Включить (true) или нет (false) визуальный редактор. См. user_can_richedit()
По умолчанию - 'true' - syntax_highlighting(строка/bool)
- Включать ли подсветку синтаксиса для визуального редактора.
- comment_shortcuts(строка/bool)
- Включить ли для пользователя сочетания клавиш модерации комментариев. Подключать или нет скрипт
enqueue_comment_hotkeys_js. См. enqueue_comment_hotkeys_js().
По умолчанию - 'false' - use_ssl(строка/bool)
- Должен ли юзер всегда логиниться по https.
По умолчанию - 'false' - show_admin_bar_front(строка)
- Показывать админ бар на сайте или нет.
По умолчанию 'true' - role(строка)
- Роль пользователя.
По умолчанию берется из настроек: get_option('default_role') - locale(строка)
- Язык пользователя (локаль). Например: ru_RU. С WP 4.7.
По умолчанию '' - default_password_nag(true/false)
- true - означает что установлен пароль по умолчанию.
Также в метаполях хранятся Опции Админ-панели — это настройки страниц адмминки и прочее. Например: сохраненные выборы метабоксов на разных страницах.
| meta_key | meta_value |
|---|---|
| admin_color | midnight |
closedpostboxes_dashboard | a:0:{} |
|
| metaboxhidden_dashboard | a:4:{i:0;s:17:"dashboard_primary";i:1;s:24:"tinypng_dashboard_widget";i:2;s:18:"dashboard_activity";i:3;s:21:"dashboard_quick_press";} |
| closedpostboxes_{POST_TYPE} | a:1:{i:0;s:11:"commentsdiv";} |
| metaboxhidden_{POST_TYPE} | a:3:{i:0;s:7:"slugdiv";i:1;s:13:"trackbacksdiv";i:2;s:11:"commentsdiv";} |
| meta-box-order_dashboard | |
| meta-box-order_{POST_TYPE} | |
| meta-box-order | |
| wp_media_library_mode | Может быть: list или grid. См. upload.php |
| show_welcome_panel | 0 |
| show_admin_bar_front | true |
| wp_user-settings устарело: wp_usersettings |
editor=tinymce&editor_expand=off&libraryContent=browse&dtmenuRight=1&mfold=o&posts_list_mode=list |
| wp_user-settings-time устарело: wp_usersettingstime |
1604820217 |
| dismissed_wp_pointers | Различные заметки которые нужно показать пользователю в админке. Может хранить следующие ключи: theme_editor_notice,wp330_toolbar,wp330_media_uploader,wp330_saving_widgets,wp340_customize_current_theme_link,wp340_choose_image_from_library,wp350_media,wp360_revisions,wp360_locks,wp390_widgets,wp410_dfw,wp496_privacy |
| {PAGE_KEY}_per_page | На страницах с WP_List_Table сколько элементов выводить в таблице. Примеры названия опций: edit_post_per_page, users_per_page, edit_comments_per_page, upload_per_page |
Роли и права пользователей
User Role Editor - плагин для управления ролями. Редактор ролей пользователей WordPress, плагин позволяет легко изменять роли и возможности пользователей.
Как работают права пользователя
- Роль - это набор capabilities
- У пользователя проверяются capabilities, а не название роли
- Capabilities роли не копируются в базу каждому пользователю
Как это хранится:
- Роли хранятся глобально в опции
wp_user_roles.- В multisite роли хранятся отдельно для каждого сайта в опции
{$wpdb->prefix}user_roles.
- В multisite роли хранятся отдельно для каждого сайта в опции
- У пользователя в
wp_capabilitiesобычно хранятся только роли.- Там же могут храниться и индивидуальные capabilities, если они добавлены напрямую через WP_User::add_cap()
Пример wp_capabilities:
[ 'editor' => true, 'administrator' => true, 'custom_cap' => true, ]
Как WordPress определяет права:
-
- берет capabilities всех ролей
- добавляет индивидуальные capabilities
- собирает итоговый набор в
$this->allcaps
-
- если это мета capability (не примитивное), сначала мапит его в примитивные
- прогоняет
$this->allcapsчерез фильтр user_has_cap - проверяет наличие указанной capability в
$this->allcaps
Важно:
- Полный рассчитанный набор capabilities у пользователя в базе не хранится
- Он собирается динамически из ролей и user caps
- Если capability выдан напрямую пользователю, он уже хранится у самого пользователя
Связь такая:
- роль = шаблон прав
- пользователь = роли + возможно отдельные права
- итоговые права = объединение этого всего
Список Ролей
По умолчанию в WordPress 6 ролей:
| Super Admin | Cупер-администратор. Имеет права для управления сетью сайтов. Эта роль появляется только при мультисайт установке. |
| administrator | Aдминистратор сайта (отдельного сайта в сети мультисайт). |
| editor | Редактор. Имеет доступ ко всем постам, страницам, комментариям, категориям, тегам и ссылкам. |
| author | Автор. Может писать, загружать фотографии, редактировать и публиковать свои посты. |
| contributor | Участник. Может писать посты, которые затем публикует редактор или админ. |
| subscriber | Подписчик. Не может ничего, кроме редактирования профиля. |
Какую роль получает новый пользователь указывается в Настройки > Общие. Данные сохраняются в опции: users_can_register и default_role:
Список прав по ролям
Актуальный список прав смотрите в файле wp-admin/includes/schema.php
Список примитивных (фундаментальных) прав пользователя. Это возможности которые по умолчанию есть у указанных ролей (пользователей).
Этот список прав задается единожды, при установке WordPress. Храниться в БД таблице wp_options в опции {$wpdb->prefix}_user_roles (wp_user_roles). Для мультисайта название этой опции будет иметь префикс таблиц WP, например wp_10_user_roles.
| Право | Супер-Админ | Админ | Редактор | Автор | Участник | Подписчик |
|---|---|---|---|---|---|---|
| read | да | да | да | да | да | да |
| delete_posts | да | да | да | да | да | |
| edit_posts | да | да | да | да | да | |
| delete_published_posts | да | да | да | да | ||
| edit_published_posts | да | да | да | да | ||
| publish_posts | да | да | да | да | ||
| upload_files | да | да | да | да | ||
| delete_others_pages | да | да | да | |||
| delete_others_posts | да | да | да | |||
| delete_pages | да | да | да | |||
| delete_private_pages | да | да | да | |||
| delete_private_posts | да | да | да | |||
| delete_published_pages | да | да | да | |||
| edit_others_pages | да | да | да | |||
| edit_others_posts | да | да | да | |||
| edit_pages | да | да | да | |||
| edit_private_pages | да | да | да | |||
| edit_private_posts | да | да | да | |||
| edit_published_pages | да | да | да | |||
| manage_categories | да | да | да | |||
| manage_links | да | да | да | |||
| moderate_comments | да | да | да | |||
| publish_pages | да | да | да | |||
| read_private_pages | да | да | да | |||
| read_private_posts | да | да | да | |||
| unfiltered_html | да | да ¹ | да ¹ | |||
| activate_plugins | да | да ² | ||||
| create_users | да | да ¹ | ||||
| deactivate_plugins | да | да | ||||
| delete_plugins | да | да ¹ | ||||
| delete_themes | да | да ¹ | ||||
| delete_users | да | да ¹ | ||||
| edit_dashboard | да | да | ||||
| edit_files | да | да ¹ | ||||
| edit_plugins | да | да ¹ | ||||
| edit_theme_options | да | да | ||||
| edit_themes | да | да ¹ | ||||
| edit_users | да | да ¹ | ||||
| export | да | да | ||||
| import | да | да | ||||
| install_languages | да | да ¹ | ||||
| install_plugins | да | да ¹ | ||||
| install_themes | да | да ¹ | ||||
| list_users | да | да | ||||
| manage_options | да | да | ||||
| promote_users | да | да | ||||
| remove_users | да | да | ||||
| switch_themes | да | да | ||||
| update_core | да | да ¹ | ||||
| update_languages | да | да ¹ | ||||
| update_plugins | да | да ¹ | ||||
| update_themes | да | да ¹ | ||||
| unfiltered_upload | да ³ | да ³ | ||||
| manage_network_options | да | |||||
| manage_network_plugins | да | |||||
| manage_network_themes | да | |||||
| manage_network_users | да | |||||
| manage_network | да | |||||
| manage_sites | да | |||||
| setup_network | да | |||||
| upgrade_network | да |
¹— когда один сайт (не мультисайт).²— когда один сайт (не мультисайт). Или включается в настройках сети.³— это право нужно включать отдельно, подробнее ниже.
Мета права
Выше перечислен список примитивных (фундаментальных) прав. Но есть еще так называемые мета-права. Они нигде не сохраняются, а вычисляются «налету» и в итоге превращаются в примитивное право.
Список мета-прав:
activate_plugin activate_plugins add_comment_meta add_post_meta add_term_meta add_user_meta add_users assign_categories assign_post_tags assign_term create_app_password create_sites create_users customize deactivate_plugin deactivate_plugins delete_app_password delete_app_passwords delete_categories delete_comment_meta delete_page delete_plugins delete_post delete_post_meta delete_post_tags delete_site delete_sites delete_term delete_term_meta delete_themes delete_user delete_user_meta delete_users edit_app_password edit_categories edit_comment edit_comment_meta edit_css edit_files edit_page edit_plugins edit_post edit_post_meta edit_post_tags edit_term edit_term_meta edit_themes edit_user edit_user_meta edit_users erase_others_personal_data export_others_personal_data install_languages install_plugins install_themes list_app_passwords manage_links manage_network manage_network_options manage_network_plugins manage_network_themes manage_network_users manage_post_tags manage_privacy_options manage_sites promote_user publish_post read_app_password read_page read_post remove_user resume_plugin resume_theme setup_network unfiltered_html unfiltered_upload update_core update_https update_languages update_php update_plugins update_themes upgrade_network upload_plugins upload_themes edit_term — WP 4.7 — Не проверят кто создал термин - только проверяет наличие указанного термина и таксономии. delete_term — WP 4.7 — assign_term — WP 4.7 — activate_plugin — WP 4.9 — current_user_can( 'activate_plugin', 'my-plugin/my-plugin.php' ) deactivate_plugin — WP 4.9 — current_user_can( 'deactivate_plugin', 'my-plugin/my-plugin.php' ) export_others_personal_data — WP 4.9.6 — is_multisite() ? 'manage_network' : 'manage_options' erase_others_personal_data — WP 4.9.6 — is_multisite() ? 'manage_network' : 'manage_options' manage_privacy_options — WP 4.9.6 — is_multisite() ? 'manage_network' : 'manage_options' update_php — WP 5.0 — is_multisite() ? is_super_admin() : update_core update_https — WP 5.7 — is_multisite() ? is_super_admin() : manage_options | update_core create_app_password — WP 5.7 — map_meta_cap( 'edit_user', $user_id ) list_app_passwords — WP 5.7 — map_meta_cap( 'edit_user', $user_id ) read_app_password — WP 5.7 — map_meta_cap( 'edit_user', $user_id ) edit_app_password — WP 5.7 — map_meta_cap( 'edit_user', $user_id ) delete_app_passwords — WP 5.7 — map_meta_cap( 'edit_user', $user_id ) delete_app_password — WP 5.7 — map_meta_cap( 'edit_user', $user_id )
Для проверки таких прав нужно передавать дополнительные параметры, например ID записи для которой нужно проверить может ли пользователь её редактировать. Например:
if( current_user_can( 'edit_post', 123 ) ){
echo 'Текущий пользователь может редактировать пост 123';
}
В этом, случае WP налету проверяет является ли пользователь автором этого поста, или у него есть примитивное право редактировать все посты. В результате, если проверка пройдена, это мета право превращается в аналогичное примитивное право, которое разрешает выполнять действие.
Подробнее о мета правах читайте в описании map_meta_cap().
Динамические права
Это права которые не хранятся в БД, а вычисляются налету по определенным условиям. Делается такое вычисление на хуке user_has_cap.
install_languages — WP 4.9 — update_core || install_plugins || install_themes resume_plugins — WP 5.2 — activate_plugins resume_themes — WP 5.2 — switch_themes view_site_health_checks — WP 5.2 — install_plugins && is_super_admin (multisite)
См. wp_maybe_grant_install_languages_cap()
См. wp_maybe_grant_resume_extensions_caps()
См. wp_maybe_grant_site_health_caps()
unfiltered_upload
По умолчанию возможность unfiltered_upload есть у администратора. Однако это право по умолчанию заблокировано, т.е. роли не пройдут проверку if( current_user_can('unfiltered_upload') ), несмотря на наличие у них такого права.
Чтобы право unfiltered_upload начало работать как ожидается, нужно в файле wp-config.php «включить» константу:
define( 'ALLOW_UNFILTERED_UPLOADS', true );
С определением этой константы роли имеющие право unfiltered_upload смогут загружать файлы с любым расширением (без проверки типа файла).
Для мультисайт сборки право unfiltered_upload есть только у Супер Администратора. Если у другой роли есть право unfiltered_upload, оно просто будет игнорироваться. Подробнее смотрите проверку мета-права в map_meta_cap():
case 'unfiltered_upload':
if ( defined( 'ALLOW_UNFILTERED_UPLOADS' ) && ALLOW_UNFILTERED_UPLOADS && ( ! is_multisite() || is_super_admin( $user_id ) ) ) {
$caps[] = $cap;
} else {
$caps[] = 'do_not_allow';
}
break;
PHP Функции
Весь список функций смотрите здесь. А вот некоторые из функций:
| current_user_can() | Проверяет права текущего пользователя, совершать указанное действие. |
| wp_get_current_user() | Получает данные о текущем авторизованном пользователе (объект WP_User). Устанавливает пользователя, если не установлен. |
| get_current_user_id() | Получает ID текущего (авторизованного) пользователя. |
| is_user_logged_in() | Проверяет авторизован ли пользователь (вошел ли пользователь под своим логином). Возвращает true, если пользователь авторизован и false, если нет. Условный тег. |
| get_userdata() | Получает данные указанного пользователя в виде объекта WP_User. |
| get_user_by() | Получает пользователя по указанному полю и значению этого поля (по ID, логину, почте). |
| get_users() | Получает пользователей в соответствии с переданными параметрами. |
| update_user_meta() | Обновляет мета поле указанного пользователя. |
| get_user_meta() | Получает отдельное мета поле или все мета поля указанного пользователя. |
| delete_user_meta() | Удаляет указанные метаданные определенного пользователя. |
| map_meta_cap() | Переводит указанную мета-возможность в примитивную возможность, чтобы потом проверить право доступа пользователя. |
| wp_insert_user() | Создает пользователя WordPress в Базе Данных. |
| wp_update_user() | Обновляет данные пользователя в базе данных. Обновляются обе таблицы wp_usermeta и wp_users. |
| wp_create_user() | Регистрирует нового пользователя. Указываются логин (имя), пароль и email. |
| register_new_user() | Регистрирует нового пользователя. Указываются только логин и email. |
| wp_login_url() | Получает URL страницы входа/авторизации: /wp-login.php |
| wp_signon() | Авторизует пользователя, по указанному логину/email, паролю и параметру remember. |
| wp_set_password() | Изменяет пароль указанного пользователя. Обновляет указанный пароль в БД и сбрасывает кэш пользователя. |
| wp_check_password() | Сравнивает строки паролей: читабельный пароль (обычный) с кодированным паролем (в виде хэша). Нужна для проверки пароля пользователя. |
| WP_User::add_cap() | Добавляет или удаляет право (возможность) у указанного пользователя. |
Процесс авторизации (установки) пользователя
Для установки текущего пользователя в ядре на хук determine_current_user повешены следующие функции. Каждая из них устанавливает текущего пользователя для разных видов запроса (фронт, REST запрос).
add_filter( 'determine_current_user', 'wp_validate_auth_cookie' ); add_filter( 'determine_current_user', 'wp_validate_logged_in_cookie', 20 ); add_filter( 'determine_current_user', 'wp_validate_application_password', 20 );
Хук determine_current_user срабатывают при первом вызове функции wp_get_current_user(), в основе которой лежит функция _wp_get_current_user().
_wp_get_current_user() устанавливает текущего пользователя в глобальную переменную $current_user при первом вызове и при последующих вызовах берет данные от туда.
Самое рано когда может быть вызвана функция wp_get_current_user() - это событие plugins_loaded (желательно с большим приоритетом, чтобы отработала в конце), т.е. после подключения всех плагинов и базовой их инициализации.
Вообще, её рекомендуется вызывать на хуке init, т.е. после того как ядро и все плагины загружены и их базовый код отработан и следующий шаг это вывод данных на экран.