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));