使用wptu_create_blog创建的站点管理员仅在第二次尝试时才可访问

时间:2017-10-15 作者:shaharsol

我允许用户创建网站,而不是通过标准注册方法,而是通过自定义插件。我使用wpmu_create_blog, 然后将该用户作为具有自定义角色的用户添加到新博客,然后wp_redirect 新站点管理员的用户:

$new_blog_id = wpmu_create_blog( $newdomain, $path, $title, $user_id, $meta, get_current_network_id() );
add_user_to_blog($new_blog_id, get_current_user_id(), \'my_custom_role\');
$blog = get_blog_details($new_blog_id,true);
$blog_url = $blog->siteurl;
$redirect_url = $blog_url . \'/wp-admin\';

wp_redirect( add_query_arg(array(
    \'custom_notice\' => \'a_custom_notice\'
),$redirect_url));
发生的情况是,用户登录到新站点管理员时会显示一条消息:抱歉,不允许您访问此页面:

enter image description here

然后当他们点击刷新时,一切都突然变好了。。。

如何使新用户在第一次尝试时可以访问新站点的管理员?

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

TLDR

user_roles 选项已损坏,可以通过更新db来修复,请参阅下面的解决方案。

世界卫生组织;为什么我能够重新创建您的问题并对其进行分析。正如您在错误中所看到的,这显然是权限和功能的问题,而事实证明,整个问题都是因为wp\\u xx\\u user\\u roles选项。

当你试图避免常规的注册过程时,globals$wpdb$wp_roles 已经存在,并且当您使用wpmu_create_blog 在您的站点中,非常重要的选项wp_xx_user_roles (xx代表博客id)是使用当前查看的博客id编写的,而不是刚刚创建的新博客id。

我的猜测是,当从注册页面创建新博客时,wordpress不会将任何博客视为当前博客,因此当它使用全新的wp\\U角色类实例时,而不是使用已设置的全局变量$wpdb$wp_roles;

我找不到任何文明的方式来解决这个问题,所以我们会做得很难看。丑陋的解决方案是在user_roles 创建新博客后的选项名称,如下所示:

    function replace_wrong_user_roles_option( $new_blog_id ){
        global $wpdb, $wp_roles;

        $current_blog_id = get_current_blog_id();
        if( $current_blog_id == $new_blog_id )
            return true;

        $prefix_length        = strlen( $wpdb->prefix );
        $blog_prefix_length   = strlen( $new_blog_id.\'_\' );
        $blog_prefix_position = strrpos ( $current_prefix, $new_blog_id.\'_\' );

        // only on new wpmu, when main blog prefix is without the blog_id
        if($current_blog_id == 1 && !$blog_prefix_position){
            $new_blog_prefix = $wpdb->prefix.$new_blog_id.\'_\';
        }else{
            $new_blog_prefix = str_replace(get_current_blog_id(), $new_blog_id, $wpdb->prefix);
        }

        return $wpdb->update(
            $new_blog_prefix.\'options\',
            array( \'option_name\' => $new_blog_prefix.\'user_roles\' ),
            array( \'option_name\' => $wpdb->prefix.\'user_roles\' )
        );
    }
您可以在创建博客后立即插入该函数调用:

    $new_blog_id = wpmu_create_blog( $newdomain, $path, $title, $user_id, $meta, get_current_network_id() );
    replace_wrong_user_roles_option( $new_blog_id );
    add_user_to_blog($new_blog_id, get_current_user_id(), \'my_custom_role\');
    $blog = get_blog_details($new_blog_id,true);
    $blog_url = $blog->siteurl;
    $redirect_url = $blog_url . \'/wp-admin\';

    wp_redirect( add_query_arg(array(
        \'custom_notice\' => \'a_custom_notice\'
    ),$redirect_url));

结束

相关推荐

Wp-admin登录后检查GET_POST值

我想在登录到wp admin后检查get\\u选项值。我已将日期保存在get\\u选项中。我想检查get\\u选项中的值是否与wp admin登录后的当前日期相同。如果相同,那么我想显示管理员通知。每次我登录到wp admin时,它都会检查get\\u选项值。这是我的管理员通知代码。I have no idea how can i check the get_option value after wp-admin login. function sample_admin_notice__success()