但关键似乎是什么时候发射。
这是正确的!什么时候remove_user_from_blog
火灾,移除尚未发生,而是即将发生,这是您介入并提前做事情的机会,例如清理。
我想wpmu\\u delete\\u user函数应该是应该使用的函数。
是的,那也是我的猜测
我看了一下抄本,但我没能把它弄好
抄本很好,但是https://developer.wordpress.org 更大,并提供更多信息
在解决此问题之前,请注意,操作会收到2个参数,第二个是博客ID,您应该检查是否存在超级管理员检查或当前用户,您可能会意外删除自己此代码需要位于MU插件或网络激活插件中。有可能在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 API
DELETE
调用用户、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
角色或更高级别。已登录但不在网站上的用户没有角色,因此他们将无法通过此检查添加挂钩init
和admin_init
要检查当前用户是否是当前站点的成员,请运行wp_redirect( \'...url...\' ) exit;
要将它们发送到根主页,或说明它们无法访问该网站的页面,请使用相同的挂钩,但将其与wp_die(\'you do not have access to this\' );
为什么删除用户是个坏主意当一个站点被删除时,所有用户都会首先从中删除,所以他们会在整个网络中被删除。这意味着多个网站上的任何教师或教授都将被删除,他们所属的其他网站也将被破坏。您可能会自行删除并失去超级管理员帐户,这是一个很高的风险。您可能会误解您可以从特定网站删除用户。这不是删除,而是删除,这是一个重要的区别这并不能解决根本问题。站点1上的用户仍然可以登录,这意味着他们登录的是网络,而不是特定的子站点。如果您的检查仅依赖于登录,那么该用户可以查看所有课程,其他所有用户也可以所以只需将用户重定向到一个地方,说明他们没有权限,并确保权限检查不仅检查他们是否登录,还检查他们的角色。