我具有一个功能,可以在用户注册时将用户复制到所有子站点。
我做到了这一点:
function sync_user( $user_id )
{
$list_ids = get_sites();
$current_site = get_current_site();
$info = get_userdata($user_id);
foreach( $list_ids as $list )
{
if ( $list->blog_id != $current_site->id )
{
add_user_to_blog($list->id, $info->ID, 'subscriber');
}
}
// quick fix for: above somehow doesn't add to main site. add to main site here.
add_user_to_blog(1, $info->ID, 'subscriber');
}
现在,当我从站点中删除用户时,我想“取消”该用户。我试图通过使用'remove_user_from_blog'对其进行挂钩,但这会导致无限循环。
我可以在哪里挂接以下代码,以便删除使用上述代码之前添加的所有用户?
function unsync_user( $user_id )
{
$list_ids = get_sites();
foreach( $list_ids as $list )
{
remove_user_from_blog( $user_id, $list->ID );
}
}
为清楚起见编辑了标题
答案 0 :(得分:0)
挂钩“ deleted_user”在删除用户后运行(“ delete_user”在删除发生前运行):
https://codex.wordpress.org/Plugin_API/Action_Reference/deleted_user
答案 1 :(得分:0)
AbdulRahman对此是正确的。当用户从用户列表中单击“删除”时,该操作不会触发“ delete_user”或“ deleted_user”钩子。我测试过了。
我认为这很棘手。因此,这是如何添加自定义的remove_user操作。将以下这些行添加到您的插件中。
add_action('remove_user_from_blog', function($user_id, $blog_id) {
// checking current action
// refer: wp-admin/users.php:99
$wp_list_table = _get_list_table( 'WP_Users_List_Table' );
if( $wp_list_table->current_action() != 'doremove' ) {
return; // only proceed for specific user list action
}
$fire_removed_user_hook = null; // closure reference
$fire_removed_user_hook = function() use ($user_id, $blog_id, &$fire_removed_user_hook) {
do_action( 'removed_user', $user_id, $blog_id );
// remove the hook back
remove_action('switch_blog', $fire_removed_user_hook);
};
// restore_current_blog called at the last line in the remove_user_from_blog function
// so action switch_blog fired
add_action('switch_blog', $fire_removed_user_hook);
}, 10, 2);
add_action('removed_user', function($user_id, $blog_id) {
// the user removed from be blog at this point
}, 10, 2);