我确实尝试过使用插件前端用户,但这与某些内容冲突,因为它阻止访问某些前端页面。所以我需要手动设置它,以便任何不是两个用户名(或角色)之一的人都无法访问wp admin。
如何阻止某些用户角色访问wp-admin?
插件基本上只是一个用户能力检查,然后在退出调用中重定向。然后它重定向到请求来自的站点。
<?php
! defined( \'ABSPATH\' ) AND exit;
/* Plugin Name: (#66093) »kaiser« Deny Admin-UI access for certain roles */
function wpse66093_no_admin_access()
{
// Do not run if the user is logged in and trying to log out
// This might need one or two more checks.
// Especially if you have custom login/logout/reset password/etc rules and routes set up.
if (
! is_admin()
|| (
is_user_logged_in()
&& isset( $GLOBALS[\'pagenow\'] ) AND \'wp-login.php\' === $GLOBALS[\'pagenow\']
)
) {
return;
}
$redirect = isset( $_SERVER[\'HTTP_REFERER\'] ) ? $_SERVER[\'HTTP_REFERER\'] : home_url( \'/\' );
if (
current_user_can( \'CAPABILITY_NAME_HERE\' )
OR current_user_can( \'CAPABILITY_NAME_HERE\' )
)
exit( wp_redirect( $redirect ) );
}
add_action( \'admin_init\', \'wpse66093_no_admin_access\', 100 );
请记住,只能使用默认值(请参见代码中的注释)。自定义登录、注销、注册、密码重置逻辑可能会破坏这一点。Roles vs. Capabilities: 由于角色名称可以更改,而且角色只是一组功能,因此最好检查功能,而不是角色名称。您可以找到内置角色和功能的列表here. 只需看看最严格的访问是什么,然后搜索匹配的功能。然后在上面分配它。如果角色名称发生更改,则更易于维护。是的,你也可以使用一个角色名,这在WordPress中可以使用,但这个概念会在角色名更改时带来难以追踪的bug。
注意:不要以分层的方式考虑角色。考虑一下会计,您在一些SaaS后端输入其电子邮件地址以接收发票。大多数开发人员都无权访问计费详细信息,会计师也无权访问部署设置或安全凭据。他们有不同的角色名称,具有相同的“高”能力,但用于完全不同的部分。在编写功能检查或向系统添加自定义功能时,请记住此示例。
公认的答案提到了用户角色,但实际上使用了用户能力的功能
以下是用户角色的解决方案
function wpse66094_no_admin_access() {
$redirect = isset( $_SERVER[\'HTTP_REFERER\'] ) ? $_SERVER[\'HTTP_REFERER\'] : home_url( \'/\' );
global $current_user;
$user_roles = $current_user->roles;
$user_role = array_shift($user_roles);
if($user_role === \'YOUR_USER_ROLE_HERE\'){
exit( wp_redirect( $redirect ) );
}
}
add_action( \'admin_init\', \'wpse66094_no_admin_access\', 100 );
只是重新审视了这个答案,因为它在很长一段时间内没有更新。年份是2021。
接受的答案是检查当前页面是否为wp-login.php
页OR 管理页面WHILE 使用admin_init
胡克,这是胡说八道。
admin_init
初始化管理屏幕或脚本时激发。确实如此NOT 只需在面向用户的管理屏幕上运行即可。它继续运行admin-ajax.php
和admin-post.php
也
在任何情况下,它都不会在wp-login.php
照现在的样子NOT 管理屏幕。虽然它确实会在ajax请求时触发,因此应该处理这种情况。wp_doing_ajax()
确定当前请求是否为WordPress Ajax请求。
在下面的示例中,我使用delete_posts
允许的用户功能admin
, editor
和author
访问Wordpress后端。请参阅Capability vs. Role Table 更具限制性的方法。
作为提醒,这里有默认的Wordpress角色(Summary of Roles):
超级管理员→
管理→
编辑→
著者→
贡献者→
订阅人
在单站点WordPress安装中,管理员实际上是超级管理员。
我选择使用wp_die()
而不是盲目地重定向用户。wp_die()
提供某种类型的用户登录,因为它会终止Wordpress的执行并显示带有错误消息的HTML页面。同样的方法也可以将用户重定向到404页面。任何能够解释这种情况的东西都比盲目的主页重定向要好。
add_action( \'admin_init\', \'restrict_wpadmin_access\' );
if ( ! function_exists( \'restrict_wpadmin_access\' ) ) {
function restrict_wpadmin_access() {
if ( wp_doing_ajax() || current_user_can( \'delete_posts\' ) ) {
return;
} else {
header( \'Refresh: 2; \' . esc_url( home_url() ) );
$args = array(
\'back_link\' => true,
);
wp_die( \'Restricted access.\', \'Error\', $args );
};
};
};
阻止默认重定向到wp-admin.php
登录后,我使用login_redirect
钩子过滤器,用于过滤登录重定向URL。我正在使用将他们重定向到他们自己的个人资料页get_author_posts_url()
, 但是你可以很容易地重定向到你想要的任何页面。您还可以根据用户角色有条件地重定向(例如:admin到admin页,rest到profile),所有内容都在CODEX页示例部分进行了解释。add_filter( \'login_redirect\', \'redirect_user_to_profile_on_login\', 10, 3 );
if ( ! function_exists( \'redirect_user_to_profile_on_login\' ) ) {
function redirect_user_to_profile_on_login( $redirect_to, $requested_redirect_to, $user ) {
if ( $user && is_object( $user ) && is_a( $user, \'WP_User\' ) ) {
$redirect_to = esc_url( get_author_posts_url( $user->ID ) );
};
return $redirect_to;
};
};
根据@kaiser提供的答案(谢谢你,顺便说一句),这是我的工作代码,只是在任何情况下有人需要它。它被放置在functions.php
文件
使用的条件是,如果用户can\'t manage_options
或edit_posts
.
function wpse66093_no_admin_access() {
$redirect = home_url( \'/\' );
if ( ! ( current_user_can( \'manage_options\' ) || current_user_can( \'edit_posts\' ) ) )
exit( wp_redirect( $redirect ) );
}
add_action( \'admin_init\', \'wpse66093_no_admin_access\', 100 );
有了@kaiser的回答,我发现您需要在admin\\u init上使用admin\\u菜单挂钩,因为它会在!user\\u can\\u access\\u admin\\u page()签入wp admin/includes/菜单。php否则,如果用户没有对仪表板的“读取”权限,他们只会得到“您没有足够的权限访问此页面”页面而不是被重定向。
如果删除read
角色的功能用户将无法访问仪表板。他们将得到以下错误:
您没有足够的权限访问此管理员页面。
原因:当前用户不具备访问“Dashboard”菜单项所需的“read”功能。