从子站点删除用户时,从多站点中删除用户

时间:2018-09-18 作者:Joris

我正在使用wordpress的多站点设置。我的子网站由其他组织的管理员管理。

问题:管理员在子网站上删除用户时,其记录仍存在于网络用户表中。反过来,当该用户返回其注册的子网站时,他/她仍然可以登录。我猜是因为它的记录仍在用户数据库中。因此,从子网站中删除基本上没有用。

可能的解决方案:当用户从子网站删除时,它也会从整个网络中删除。

我看了一下抄本,但没法让它起作用。我想wpmu\\u delete\\u user函数应该是应该使用的函数。但关键似乎是什么时候发射。我曾想过添加它以从\\u blog中删除\\u user\\u,但它不起作用。

这是atm的代码,希望你能帮忙!

add_action( \'remove_user_from_blog\', \'remove_user_from_network\', 10,2 );
function remove_user_from_network( $user_id ) {
    global $wpdb;
    $user_id = (int) $user_id;
    wpmu_delete_user( $user_id );
}

1 个回复
SO网友:Tom J Nowell

但关键似乎是什么时候发射。

这是正确的!什么时候remove_user_from_blog 火灾,移除尚未发生,而是即将发生,这是您介入并提前做事情的机会,例如清理。

我想wpmu\\u delete\\u user函数应该是应该使用的函数。

是的,那也是我的猜测

我看了一下抄本,但我没能把它弄好

抄本很好,但是https://developer.wordpress.org 更大,并提供更多信息

在解决此问题之前,请注意,操作会收到2个参数,第二个是博客ID,您应该检查是否存在超级管理员检查或当前用户,您可能会意外删除自己functions.php 但那将是非常糟糕的做法。在通过WP CLI删除用户时,它也可能会导致问题您没有提供任何上下文,因此无论这解决了什么问题,您都应该询问问题,然后提出您不知道如何实现的可能解决方案。这样一来,您可能会得到一个您没有想到的更好的解决方案,如果一个用户是多个博客的成员,这将在用户从1中删除后从所有博客中删除他们,这是出乎意料的

But most importantly, deleting a blog will call remove_user_from_blog deleting every user, including yourself.

So, I would not recommend doing this.

相反,它试图解决的问题是什么?

如前所述,钩子和无限循环remove_user_from_blog 事件激发before 删除,因此您无法删除该挂钩上的用户或remove_user_from_blog 函数将失败,并且最终不会进行清理或删除。

更糟糕的是,wpmu_delete_user 呼叫remove_user_from_blog 在内部,因此您最终将陷入一个无限循环,它试图从博客中删除用户,但随后您的操作调用wpmu_delete_user, 试图将用户从博客中删除,从而再次无限期触发您的操作

遗憾的是,没有removed_user_from_blog 我们可以参与的行动。我建议您通过Core Trac添加到下一个WP版本中,这是一个超级简单的补丁,您将出现在关于页面的下一个WP版本的信用中

备选方案

我担心,您将需要连接到可能从博客中删除用户的所有可能方案中。您需要检测表单提交和URL,以便在上删除它们admin_init, REST APIDELETE 调用用户、WP CLI命令等

Put simply, there is no simple filter or action that will let you do this in a foolproof manner. 这不是一个简单的琐碎问题,当新情况出现时,您必须添加到它中,并在插件发生变化时说明所有插件。

然而,如果将该额外行动添加到WP core中,则会出现。但是,这应该解决什么问题呢?

编辑:真正的问题

由于一些澄清的评论,现在发现每个网站都是一门教育课程。

我假设检查内容是否可见不使用角色,而是只检查is_user_logged_in().

因此,取而代之的是:

检查用户是否具有subscriber 角色或更高级别。已登录但不在网站上的用户没有角色,因此他们将无法通过此检查添加挂钩initadmin_init 要检查当前用户是否是当前站点的成员,请运行wp_redirect( \'...url...\' ) exit; 要将它们发送到根主页,或说明它们无法访问该网站的页面,请使用相同的挂钩,但将其与wp_die(\'you do not have access to this\' );所以只需将用户重定向到一个地方,说明他们没有权限,并确保权限检查不仅检查他们是否登录,还检查他们的角色。

结束