WordPress как на ладони

Пользователи в 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, плагин позволяет легко изменять роли и возможности пользователей.

По умолчанию в WordPress 6 ролей:

Super Admin Cупер-администратор. Имеет права для управления сетью сайтов. Эта роль появляется только при мультисайт установке.
administrator Aдминистратор сайта (отдельного сайта в сети мультисайт).
editor Редактор. Имеет доступ ко всем постам, страницам, комментариям, категориям, тегам и ссылкам.
author Автор. Может писать, загружать фотографии, редактировать и публиковать свои посты.
contributor Участник. Может писать посты, которые затем публикует редактор или админ.
subscriber Подписчик. Не может ничего, кроме редактирования профиля.

Какую роль получает новый пользователь указывается в Настройки > Общие. Данные сохраняются в опции: users_can_register и default_role:

Список прав по ролям

Список примитивных (фундаментальных) прав пользователя. Это возможности которые по умолчанию есть у указанных ролей (пользователей). Этот список прав задается единожды, при установке WordPress - он сохраняется в таблицу БД wp_options в опцию wp_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().

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, т.е. после того как ядро и все плагины загружены и их базовый код отработан и следующий шаг это вывод данных на экран.

5 комментариев
    Войти