禁止删除除订阅者之外的任何用户角色

时间:2014-02-01 作者:Baylock

在管理我的博客时,我想阻止任何人(包括管理员)删除任何用户,除非它是一个简单的订阅者。

基本上,在管理的“用户”部分,我希望“删除”选项仅在订阅者下可见,而不是在管理员、编辑、作者或贡献者下可见。

我如何在我的函数中做到这一点。php文件(我对插件不感兴趣)?

我尝试了“remove\\u cap(\'delete\\u users\')”功能,但它的作用域太大,因为它阻止删除任何用户,而我想阻止删除除订阅者以外的任何用户。

谢谢你的帮助。

3 个回复
最合适的回答,由SO网友:s_ha_dum 整理而成

如果您是指用户列表上的删除按钮/wp-admin/users.php, 然后该按钮由WP_Users_List_Tablearound (currently) line 256. 如果再往下看几行,就会看到一个名为user_row_actions. 您可以使用它隐藏“删除”链接。

add_filter(
  \'user_row_actions\',
  function($actions, $user_object) {
    if (1 >= count($user_object->roles) && \'subscriber\' !== $user_object->roles[0]) {
      unset($actions[\'delete\']);
    }
    return $actions;
  },
  1,2
);
最低限度的测试,但我认为这一逻辑是正确的。您应该看到订阅服务器的“删除”链接,但不应看到具有任何其他角色的用户的“删除”链接,包括具有“订阅服务器”的用户and 其他一些角色,以防你有这种奇怪的设置。

如果你仔细观察,并有一个淘气的头脑,你会注意到你仍然可以通过操纵URL中的用户ID来删除任何你想要的用户。仔细观察:

/wp-admin/users.php?action=delete&user=9&_wpnonce=8059e669c1
上面的过滤器只是隐藏链接。它不会阻止访问删除屏幕。为此,我们需要更多的代码:

add_action(
  \'load-users.php\',
  function() {
    if (isset($_GET[\'action\']) && \'delete\' === $_GET[\'action\']) {
      if (isset($_GET[\'user\'])) {
        $user_object = get_userdata($_GET[\'user\']);
        if (1 >= count($user_object->roles) && \'subscriber\' !== $user_object->roles[0]) {
          wp_die(\'This user cannot be deleted\');
        }
      }
    }
  }
);
即使这样,一个聪明的用户might 仍然能够向右推动POST 值并删除用户,因此您可能还需要在删除用户之前进行最终的故障保护。

add_action(
  \'delete_user\', 
  function($id) {
    $user_object = get_userdata($id);
    if (1 >= count($user_object->roles) && \'subscriber\' !== $user_object->roles[0]) {
      wp_die(\'This user cannot be deleted\');
    }
  }
);
注意:这段代码是在一个MU插件文件中测试的。我想应该是从functions.php 但一定要核实一下。此外,在实践中,我可能会尝试提取一些逻辑,以便它可以重用。这些回调几乎是重复的,非常危险。

SO网友:Baylock

好的,s\\u ha\\u dum,我做了一些修改:

“count”似乎破坏了功能,但像这样,它就像一个符咒:

function test($actions, $user_object) 
{
    if ( \'subscriber\' !== $user_object->roles[0]) {unset($actions[\'delete\']);}
    return $actions;
}
add_filter(\'user_row_actions\',\'test\',1,2);
谢谢你的大力帮助!

SO网友:webtechie

是的,我们可以通过以下方式实现。

add_filter( \'user_row_actions\', \'custom_action_function\', 1, 2 );
function custom_action_function($actions, $user_object) {
    if ( 1 >= count( $user_object->roles ) && \'subscriber\' !== $user_object->roles[0] ) {
      unset( $actions[\'delete\'] );
    }
    return $actions;
}

结束

相关推荐

GoPardy托管wp-admin问题

我在GoDaddy托管帐户(Windows)上的/wp admin登录页有一个大问题。如果访问以下url,我将无法登录。我再次被引导到登录页面。域。com/wp admin如果使用以下URL,我可以登录。域。com/wp admin/(末尾带正斜杠)域。com/admin域。com/login我将要使用的域指向wordpress的安装,它位于根目录的子目录下。禁用permalinks(删除了web.config,我想是windows的.htaccess)禁用的插件在数据库中验证了站点URL(它不包含额外的