Avoid having infinite loops

时间:2017-05-01 作者:Christopher

我正在使用以下代码(https://developer.wordpress.org/reference/hooks/set_user_role/) 在多站点安装上,在其博客之间同步用户角色。

我的问题是,这种方法是否会导致无限循环?

// Sync user role
add_action( \'set_user_role\', \'sync_user_role\', 10, 2 );
function sync_user_role( $user_id, $role ) {

    $blogs = get_blogs_of_user( $user_id );

    $blogs_count = count( $blogs );

    if ( $blogs_count > 1 ) {
        foreach ( $blogs as $blog ) {

            $user_blog = new WP_User( $user_id, \'\', $blog->userblog_id );

            $user_blog->set_role( $role );
        }
    }
}

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

是的,它会给你无限循环,因为你在调用WP_User::set_role 中的方法set_user_roleWP_User::set_role 方法

不确定安装程序是什么,但您可以尝试只运行一次,使用

remove_action( current_action(), __FUNCTION__ );
作为回调的第一行,或者使用另一个钩子。

更新:我刚刚注意到我写错了filter 而不是action, 但这也会起到同样的作用;-)现在已经调整好了

SO网友:Pascal Knecht

在设置规则之前,必须删除筛选器。请参见下面的代码示例:

// Sync user role
add_action( \'set_user_role\', \'sync_user_role\', 10, 2 );
function sync_user_role( $user_id, $role ) {

    $blogs = get_blogs_of_user( $user_id );

    $blogs_count = count( $blogs );

    if ( $blogs_count > 1 ) {
        foreach ( $blogs as $blog ) {

            $user_blog = new WP_User( $user_id, \'\', $blog->userblog_id );
            remove_action( \'set_user_role\', \'sync_user_role\', 10);
            $user_blog->set_role( $role );
            add_action( \'set_user_role\', \'sync_user_role\', 10, 2 );
        }
    }
}