我们将如何限制除admins之外的所有用户对WP admin区域的访问?
我们网站上的用户拥有自己的个人资料页面,这些页面可以执行他们所需的所有功能。

因此,admin应该是对除管理员以外的所有用户都设置了禁区。

如何做到这一点?

评论

您的意思是有些“前端”用户页面不需要访问位于yourdomain.com/wp-admin的任何内容?

对,就是这样。这有什么问题吗?

不,只是澄清一下。

#1 楼

我们可以连接到admin_init操作,并通过使用current_user_can()函数检查用户是否是管理员,以查看当前用户是否可以manage_options,这仅是管理员可以执行的操作。

此代码何时粘贴到functions.php文件中时,非管理员尝试访问仪表板时将显示一条消息:

function wpse_11244_restrict_admin() {

    if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
        return;
    }

    if ( ! current_user_can( 'manage_options' ) ) {
        wp_die( __( 'You are not allowed to access this part of the site' ) );
    }
}

add_action( 'admin_init', 'wpse_11244_restrict_admin', 1 );


如果您愿意,可以提供更好的用户体验通过将用户重定向到主页来代替:

function wpse_11244_restrict_admin() {

    if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
        return;
    }

    if ( ! current_user_can( 'manage_options' ) ) {
        wp_redirect( home_url() );
        exit;
    }
}

add_action( 'admin_init', 'wpse_11244_restrict_admin', 1 );


如果要将用户重定向到他们的个人资料页面,请使用链接替换上面代码中的home_url()

评论


这个答案不符合问题的要求。首先,您将禁止具有“ manage_options”功能的用户访问管理区域,并且可以将一个功能分配给多个角色,而不仅仅是管理员。此外,可以从管理员中删除“ manage_options”功能。

– cybmeta
2014年6月11日14:36



@cybmeta检查manage_options功能是用于检查管理员用户的公认方法。甚至马克·贾奎斯(Mark Jaquith)都这样

–乳木果
2014年6月11日在22:26



发问者正好要求检查管理员用户角色,我认为给他准确的答案并解释何时以及为什么更好地检查功能很重要。您说manage_options是只有“管理员”才能做的事情,但事实并非如此,manage_options是一项功能,可以从管理员角色中删除或分配给其他用户角色。重要的是要知道您想做什么并选择最佳方法。看到我的答案,我解释一下。

– cybmeta
2014年6月12日8:02

先生,您要+1! :)一直在寻找这个小时!也有一点改进。单点检查就足够了。对于多站点,您需要将manage_options替换为manage_network。后者将禁用默认“站点管理员”的仪表板,但保留对超级管理员(网络管理员)的访问权限。

–rkeet
2014年8月20日上午11:57

这个答案的主要问题是它与ajax调用冲突。 @cybmeta在下面有正确的答案。

–防暴法
19年4月17日在20:04

#2 楼

您可以编写一个插件并连接到admin_init

抄本实际上给出了您要查找的功能的示例。

http://codex.wordpress.org/Plugin_API/Action_Reference/admin_init#示例:_Access_control

评论


这不是一个完整的答案-它应该不仅仅是提示和链接

–乳木果
13年1月8日在4:37

#3 楼

给出的一些答案在大多数情况下都可以,但是我认为它们都不能保证完全按照要求执行,因为没有答案可以检查用户角色,他们可以检查功能,并且可以从角色中删除功能。因此,要给出确切答案,必须检查用户角色,而不是功能:

add_action( 'admin_init', 'allow_admin_area_to_admins_only');
function allow_admin_area_to_admins_only() {

      if( defined('DOING_AJAX') && DOING_AJAX ) {
            //Allow ajax calls
            return;
      }

      $user = wp_get_current_user();

      if( empty( $user ) || !in_array( "administrator", (array) $user->roles ) ) {
           //Redirect to main page if no user or if the user has no "administrator" role assigned
           wp_redirect( get_site_url( ) );
           exit();
      }

 }


如果要检查用户是否具有“ manage_options”功能,则可以能够。实际上,在大多数情况下,这是最佳选择。尽管此功能默认情况下与管理员用户相关联,但是可以从管理员角色中删除该功能,也可以将其分配给其他用户角色。因此,在大多数情况下,检查用户可以做什么或不可以做什么比检查用户角色更好。因此,在大多数情况下,应该选择检查功能,但您必须清楚此概念,并根据自己的情况和目的选择最佳选择:

add_action( 'admin_init', 'admin_area_for_manage_options_only');
function admin_area_for_manage_options_only() {

      if( defined('DOING_AJAX') && DOING_AJAX ) {
            //Allow ajax calls
            return;
      }


      if( ! current_user_can( "manage_options" ) ) {
           //Redirect to main page if the user has no "manage_options" capability
           wp_redirect( get_site_url( ) );
           exit();
      }

 }


评论


这是正确的答案。它不会与ajax调用冲突。

–防暴法
19年4月17日在20:04

#4 楼

尝试使用Adminimize插件。
您可以将其锁定得很好。

您还可以尝试通过htaccess文件设置访问权限

评论


+1用于管理。那是一个插件的野兽。再加上一些自定义角色管理器插件,它简直是摇摇欲坠。 (如果对不起我个人的意见)::::最后,请注意:除了提供链接以外,请提供更多信息,这将使“答案”更加完整。

–brasofilo
2012年10月20日下午5:02

#5 楼

function wpse_11244_restrict_admin() {
    if (!current_user_can('update_core')) {
        wp_die(__('You are not allowed to access this part of the site'));
    }
}

add_action('admin_init', 'wpse_11244_restrict_admin', 1);


评论


“管理员”不是功能。它仅用于保持向后兼容性。检查“ update_core”或其他管理功能。

– fuxia♦
2012年5月10日16:10

此外,可以将功能分配给角色,因此,如果要允许访问“管理员”用户,则应检查角色而不是功能。

– cybmeta
2014年6月11日14:47

#6 楼

将这些行放入您的functions.php

function baw_no_admin_access()
{
 if( !current_user_can( 'administrator' ) ) {
     wp_redirect( home_url() );
     die();
  }
}
add_action( 'admin_init', 'baw_no_admin_access', 1 );


评论


像@toscho一样,“ administrator”不是一种功能,而应使用“ update_core”之类的管理功能

–皮埃尔
2012-12-27 9:33

#7 楼

尝试此操作,决不要面对最终用户的错误。反对一个好的用户体验。此代码将它们重定向到Home。

    add_action( 'init', 'blockusers_init' );
function blockusers_init() {
if ( is_admin() && ! current_user_can( 'administrator' ) &&
! ( defined( 'DOING_AJAX' ) && DOING_AJAX ) ) {
wp_redirect( home_url() );
exit;
}
}


#8 楼

我会使用WP Frontend并将其设置给每个期望管理员的人。

评论


请提供更多信息,然后提供链接-可使答案更完整

–乳木果
13年1月8日,下午4:42