问题描述

我正在开发一个内部网,我正在使用 Justin Tadlock 的 Members 插件来控制角色和功能。

我创建了一个 HR 角色,允许人力资源人员创建和编辑用户帐户。在 WP 中创建的所有员工都获得了 contributor 角色,并为 editoradministrator 角色提供了一些选定的员工。

我想要的是阻止员工登录和更改自己的个人资料信息。只有 HR 角色的工作人员才能编辑个人资料信息。

最佳解决办法

非常好的答案,让我们进一步了解,任何人都希望将其应用于所有 non-admin 用户 (例如,贡献者,编辑者等)

// ===== remove edit profile link from admin bar and side menu and kill profile page if not an admin
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( 'Please contact your administrator to have your profile information changed.' );
    }
    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: Restricts users from editing their own profile information.
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( 'You are not permitted to change your own profile information. Please contact a member of HR to have your profile information changed.' );
    }
}
?>

上述代码阻止任何人编辑自己的个人资料信息,尽管他们是谁。有能力创建和编辑用途的人仍然可以这样做,但不能改变自己的。

第三种解决办法

解决方案作为 (MU-) 插件

我检查了所有提供的解决方案,并认为我可以做出一个很好的 MU-Plugin 。唯一真正的变化是它避免了

<?php
! defined( 'ABSPATH' ) AND exit;
/**
 * Plugin Name: Disable profile page link
 * Description: Remove edit profile link from admin bar and side menu and kill profile page if user isn't an administrator.
 */
# Version: 2012-09-15.2245

function oxo_stop_access_profile()
{
    // Remove AdminBar Link
    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 (sub)menu items
    remove_menu_page( 'profile.php' );
    remove_submenu_page( 'users.php', 'profile.php' );

    // Deny access to the profile page and redirect upon try
    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 调试设置为 true,它将抛出”undefined constant” 错误。要解决这个问题 :

if(defined('IS_PROFILE_PAGE') && IS_PROFILE_PAGE === true){
........................
}

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。