Как переименовать название роли пользователя без плагина?
Есть ли способ переименовать название роли пользователя через хук, вместо использования плагина?
Редактирование
Например, administrator
» owner

function change_role_name() {
global $wp_roles;
if ( ! isset( $wp_roles ) )
$wp_roles = new WP_Roles();
// Можно вывести список всех доступных ролей таким образом...
//$roles = $wp_roles->get_names();
//print_r($roles);
// Можно заменить "administrator" на любую другую роль: "editor", "author", "contributor" или "subscriber"...
$wp_roles->roles['administrator']['name'] = 'Владелец';
$wp_roles->role_names['administrator'] = 'Владелец';
}
add_action('init', 'change_role_name');
http://www.garyc40.com/2010/04/ultimate-guide-to-roles-and-capabilities/

У меня не получилось заставить это работать. Что бы я ни делал, в процессе создания в админке всё равно отображается 'Subscribers'. Похоже, что $wp_roles
теперь содержит часть массива [role_objects]
.

Это дало очень странный результат. Изменилась только первая буква ("Одминистратор")!

Это решение не обновляет запись в базе данных. Вы изменяете название только для текущего экземпляра, и если это действие не сработает, это может нарушить вашу логику. В классе Wp_Role нет метода для сохранения. Лучший способ - использовать $roles = get_option('user_roles'); $roles['administrator']['name'] = "Owner"; update_option('user_roles', $roles);
. Этот код нужно выполнить только один раз.

Если вы используете WordPress версии 4.7 или выше, вы можете сделать это с помощью действия wp_roles_init
, например так:
add_action( 'wp_roles_init', static function ( \WP_Roles $roles ) {
$roles->roles['administrator']['name'] = 'Владелец';
$roles->role_names['administrator'] = 'Владелец';
} );

На самом деле, существует множество способов достичь этого:
С помощью чистого PHP и MySQL вы можете отредактировать сериализованную запись в базе данных. Действительно, WordPress хранит сериализованный массив ролей в таблице wp_options
.
Итак:
- Получите сериализованный массив:
SELECT option_value as serialized_string FROM wp_options WHERE option_name = 'wp_user_roles';
- Десериализуйте строку – PHP:
$rolesArray = unserialize($serialized_string)
- Измените название роли – PHP:
$rolesArray['role_key']['name'] = "Новое название"
- Снова сериализуйте массив – PHP:
echo serialize($rolesArray)
- Замените содержимое
option_value
в базе данных на результат из предыдущего пункта
Если вы уверенно работаете с WordPress, вы даже можете использовать встроенный REPL WordPress в wp-cli для получения сохраненного значения с помощью get_option('wp_user_roles')
, а затем использовать update_option
для его обновления.
И (всегда) не забывайте делать резервную копию базы данных перед манипуляциями с опциями ;)
Или, если вас не волнует значение role_key…
…это очень легко сделать с помощью wp-cli:
- дублируйте существующую роль –
$ wp role create new_role 'Новая роль' --clone=old_role
- удалите старую –
$ wp role delete old_role
- затем свяжите new_role с пользователем(ями).
- при необходимости повторите шаги 1 и 2, пока old_role не станет равным new_role

Простое решение — добавить пользовательскую роль с помощью add_role
, так вы сможете задать любое имя и добавить нужные права.
http://codex.wordpress.org/Function_Reference/add_role

Вы можете создать собственный файл локализации. Скачайте этот файл: http://svn.automattic.com/wordpress-i18n/pot/trunk/wordpress.pot и отредактируйте его с помощью программы PoEdit (например). На следующем шаге сохраните файл локализации как en_GB.mo (или с другим названием) и отредактируйте файл wp-config:
define ("WPLANG", "en_GB");
