如果您是指用户列表上的删除按钮/wp-admin/users.php
, 然后该按钮由WP_Users_List_Table
班around (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
但一定要核实一下。此外,在实践中,我可能会尝试提取一些逻辑,以便它可以重用。这些回调几乎是重复的,非常危险。