如果您想完全消除用户访问配置文件的可能性,您可以
允许管理员选择哪些用户可以访问配置文件,哪些用户不能访问配置文件从菜单和管理栏中删除配置文件链接,确保即使通过手动键入地址直接访问配置文件,也无法访问配置文件第1步第一点很容易使用\'personal_options\', \'edit_user_profile_update\' 挂钩:
add_action( \'personal_options\', \'rpa_profile_ban_field\' );
add_action( \'edit_user_profile_update\', \'rpa_profile_ban_field_save\' );
function rpa_profile_ban_field( \\WP_User $user ) {
$current = wp_get_current_user();
if ( ! is_admin() || $user->ID === $current->ID ) return;
if ( ! user_can( $current, \'edit_users\' ) ) return;
$target = new WP_User( $user->ID );
if ( $target->exists() && ! user_can( $target, \'edit_users\' ) ) {
$banned = (int) get_user_meta( $user->ID, \'_profile_banned\', TRUE );
?>
<table class="form-table"><tbody><tr>
<th scope="row">Profile Ban</th><td>
<input<?php checked(1, $banned); ?> name="_profile_banned" value="1" type="checkbox">
Ban user to enter profile?
</td></tr></tbody></table>
<?php
}
}
function rpa_profile_ban_field_save( $userid ) {
$current = wp_get_current_user();
if ( ! is_admin() || $user->ID === $current->ID ) return;
if ( ! user_can( $current, \'edit_users\' ) ) return;
$target = new WP_User( $userid );
if ( ! $target->exists() || user_can( $target, \'edit_users\' ) ) return;
$ban = filter_input( INPUT_POST, \'_profile_banned\', FILTER_SANITIZE_NUMBER_INT );
if ( (int) $ban > 0 ) {
update_user_meta( $userid, \'_profile_banned\', 1 );
} elseif ( get_user_meta( $userid, \'_profile_banned\', TRUE ) ) {
delete_user_meta( $userid, \'_profile_banned\' );
}
}
使用此代码,管理员可以访问每个用户并禁用对配置文件页面的访问。这是代码的输出:
第2步
从菜单中删除配置文件链接很容易使用
remove_menu_page
:
add_action( \'admin_menu\', \'rpa_profile_menu_remove\' );
function rpa_profile_menu_remove(){
$remove = get_user_meta( get_current_user_id(), \'_profile_banned\', TRUE );
if ( ! current_user_can( \'edit_users\' ) && (int) $remove > 0 ) {
remove_menu_page( \'profile.php\' );
}
}
从管理栏中删除配置文件链接稍微复杂一些,或者更好一些,完全删除右上角的用户菜单很容易使用
$wp_admin_bar->remove_menu(\'my-account\')
(参见
WP_Admin_Bar
docs), 但这是“不美观的”,而且您也可以删除注销的可能性。因此,更好的解决方案是只删除到概要文件的链接:
add_action( \'wp_before_admin_bar_render\', \'rpa_profile_adminbar_remove\' );
function rpa_profile_adminbar_remove() {
$remove = get_user_meta( get_current_user_id(), \'_profile_banned\', TRUE );
if ( (int) $remove !== 1 || current_user_can( \'edit_users\' ) ) return;
global $wp_admin_bar;
$account = (array) $wp_admin_bar->get_node(\'my-account\');
$info = (array) $wp_admin_bar->get_node(\'user-info\');
$logout = (array) $wp_admin_bar->get_node(\'logout\');
$account[\'href\'] = $info[\'href\'] = \'#\';
$wp_admin_bar->remove_node(\'my-account\');
$wp_admin_bar->remove_node(\'user-info\');
$wp_admin_bar->remove_node(\'edit-profile\');
$wp_admin_bar->remove_node(\'logout\');
$wp_admin_bar->add_node($account);
$wp_admin_bar->add_node($info);
$wp_admin_bar->add_node($logout);
}
步骤3
使用上面的所有代码,用户再也看不到概要文件的链接,但是,只需键入
http://www.example.com/wp-admin/profile.php
并显示配置文件页面。这很容易解决:
add_action( \'load-profile.php\', \'rpa_profile_banned_check\' );
add_action( \'load-index.php\', \'rpa_profile_banned_msg\' );
add_action( \'all_admin_notices\', \'rpa_profile_banned_msg\' );
function rpa_profile_banned_check() {
$remove = get_user_meta( get_current_user_id(), \'_profile_banned\', TRUE );
if ( (int) $remove === 1 && ! current_user_can( \'edit_users\' ) ) {
wp_redirect( add_query_arg( array( \'pbanned\' => 1), admin_url(\'index.php\') ) );
exit();
}
}
function rpa_profile_banned_msg() {
if ( current_user_can( \'edit_users\' ) ) return;
static $show = false;
if ( current_filter() === \'load-index.php\' ) {
$msg = (int) filter_input( INPUT_GET, \'pbanned\', FILTER_SANITIZE_NUMBER_INT);
$banned = (int) get_user_meta( get_current_user_id(), \'_profile_banned\', TRUE );
$show = ( $msg === $banned && $banned === 1 );
} elseif ( current_filter() === \'all_admin_notices\' && $show ) {
echo \'<div class="error"><p>Sorry, you are not allowed to edit your profile.</p></div>\';
}
}
前面的代码检查在加载配置文件页面时是否禁止用户,如果是,则将用户重定向到仪表板,在url中添加一个变量,允许显示一条消息,通知用户不允许查看配置文件。
这是消息的显示方式:
所有代码,作为插件,在Gist中提供here.