Запретить пользователю редактировать информацию своего профиля
В настоящее время я разрабатываю интранет и использую плагин Members от Justin Tadlock для управления ролями и возможностями.
Я создал роль HR
чтобы позволить сотрудникам отдела кадров создавать и редактировать учетные записи пользователей. Всем сотрудникам, созданным в WP, назначается роль contributor
, а некоторым избранным сотрудникам предоставляются роли editor
и administrator
.
Я хочу запретить сотрудникам входить в систему и изменять информацию своего профиля. Только сотрудники с ролью HR
должны иметь возможность редактировать информацию профиля.

Отличный ответ! Чтобы пойти ещё дальше и помочь тем, кто хочет применить это ко всем пользователям, не являющимся администраторами (например, авторам, редакторам и т.д.)
// ===== Удаляем ссылку на редактирование профиля из админ-панели и бокового меню, а также блокируем доступ к странице профиля, если пользователь не администратор
if( !current_user_can('activate_plugins') ) {
function mytheme_admin_bar_render() {
global $wp_admin_bar;
$wp_admin_bar->remove_menu('edit-profile', 'user-actions');
}
add_action( 'wp_before_admin_bar_render', 'mytheme_admin_bar_render' );
function stop_access_profile() {
if(IS_PROFILE_PAGE === true) {
wp_die( 'Пожалуйста, обратитесь к администратору для изменения данных вашего профиля.' );
}
remove_menu_page( 'profile.php' );
remove_submenu_page( 'users.php', 'profile.php' );
}
add_action( 'admin_init', 'stop_access_profile' );
}

Разобрался с этим, потратив немного времени. Вот код, который я использую:
<?php
/*
Plugin Name: Restrict User Editing Own Profile
Plugin URI: http://www.philosophydesign.com
Description: Ограничивает пользователей от редактирования собственной информации в профиле.
Author: Scott Cariss
Version: 0.1
Author URI: http://www.philosophydesign.com/scott-cariss.html
*/
add_action( 'admin_menu', 'stop_access_profile' );
function stop_access_profile() {
remove_menu_page( 'profile.php' );
remove_submenu_page( 'users.php', 'profile.php' );
if(IS_PROFILE_PAGE === true) {
wp_die( 'Вам не разрешено изменять информацию в собственном профиле. Пожалуйста, обратитесь к представителю отдела кадров для внесения изменений.' );
}
}
?>
Приведённый выше код запрещает всем пользователям редактировать свою собственную информацию в профиле, независимо от их роли. Пользователи, у которых есть возможность создавать и редактировать других пользователей, сохраняют эти права, но не могут изменять свой собственный профиль.

Решение в виде (MU-)Плагина
Я проверил все предложенные решения и подумал, что можно сделать из этого хороший MU-Плагин. Единственное реальное изменение - это избегание
<?php
! defined( 'ABSPATH' ) AND exit;
/**
* Plugin Name: Отключение ссылки на страницу профиля
* Description: Удаляет ссылку на редактирование профиля из панели администратора и бокового меню, а также блокирует доступ к странице профиля, если пользователь не является администратором.
*/
# Version: 2012-09-15.2245
function oxo_stop_access_profile()
{
// Удаление ссылки в панели администратора
if (
'wp_before_admin_bar_render' === current_filter()
AND ! current_user_can( 'manage_options' )
)
return $GLOBALS['wp_admin_bar']->remove_menu( 'edit-profile', 'user-actions' );
// Удаление пунктов (под)меню
remove_menu_page( 'profile.php' );
remove_submenu_page( 'users.php', 'profile.php' );
// Запрет доступа к странице профиля и перенаправление при попытке входа
if (
defined( 'IS_PROFILE_PAGE' )
AND IS_PROFILE_PAGE
AND ! current_user_can( 'manage_options' )
)
{
wp_redirect( admin_url() );
exit;
}
}
add_action( 'wp_before_admin_bar_render', 'oxo_stop_access_profile' );
add_action( 'admin_menu', 'oxo_stop_access_profile' );

Все приведенные выше решения используют константу IS_PROFILE_PAGE
if( IS_PROFILE_PAGE === true ) {
Однако, если в WordPress включен режим отладки (debug), это вызовет ошибку "undefined constant" (неопределенная константа). Для исправления:
if( defined('IS_PROFILE_PAGE') && IS_PROFILE_PAGE === true ){
........................
}

add_action( 'admin_menu', 'prefix_disable_profile_access' );
function prefix_disable_profile_access() {
if( ! current_user_can('editor') || ! current_user_can('administrator') ) { // Здесь можно указать роли пользователей, которые могут редактировать свои профили.
remove_menu_page( 'profile.php' );
remove_submenu_page( 'users.php', 'profile.php' );
if ( true === IS_PROFILE_PAGE ) {
wp_die( 'Вам не разрешено изменять информацию в своем профиле. Пожалуйста, обратитесь к сотруднику отдела кадров для внесения изменений.' );
}
}
}
Надеюсь, это кому-то поможет.

У меня была такая же проблема, и я нашел способ отключить редактирование для всех пользователей, не являющихся администраторами. Вот как это выглядит:
add_action('admin_init', 'disable_profile_edit_for_non_admins');
function disable_profile_edit_for_non_admins() {
$user = wp_get_current_user();
if (in_array('subscriber', $user->roles)) {
add_action('init', function() {
remove_action('admin_color_scheme_picker', 'admin_color_scheme_picker');
});
add_action('admin_init', function() {
if (isset($_GET['action']) && $_GET['action'] == 'profile') {
wp_die('Вам не разрешено редактировать свой профиль.');
}
});
add_filter('user_has_cap', function($allcaps, $cap, $args) {
if ($cap[0] == 'edit_user' && $cap[1] == $args[0]->ID) {
$allcaps['edit_user'] = false;
}
return $allcaps;
}, 10, 3);
}
}

Я использую плагин Remove Dashboard Access для этого.
