允许用户使用相同的电子邮件地址通过WooCommerce在多站点上注册

时间:2017-03-15 作者:mcon

我正在建立一个多站点环境,并且遇到了一个用户试图使用主站点上使用的相同电子邮件地址在子站点上注册的可能性。我找到了一些代码here 这将删除重复的电子邮件地址错误并完成此任务。

下面是上面链接的答案中的相关代码:

add_filter(\'wpmu_validate_user_signup\', \'skip_email_exist\');
function skip_email_exist($result){
    if(isset($result[\'errors\']->errors[\'user_email\']) && ($key = array_search(__(\'Sorry, that email address is already used!\'), $result[\'errors\']->errors[\'user_email\'])) !== false) {
        unset($result[\'errors\']->errors[\'user_email\'][$key]);
        if (empty($result[\'errors\']->errors[\'user_email\'])) unset($result[\'errors\']->errors[\'user_email\']);
    }
    define( \'WP_IMPORTING\', \'SKIP_EMAIL_EXIST\' );
    return $result;
}
与我的情况不同的是,我们只允许用户通过在子网站上购买WooCommerce进行注册,显然,WooCommerce不使用相同的挂钩来验证电子邮件地址。

是否有一个操作可以让我通过WooCommerce执行相同的功能?

1 个回复
SO网友:Justin

您可以选择不允许用户在主站点注册,只允许用户在子网站注册。插件network-subsite-user-registration 允许这样做,如果用户已经在网络上注册,则插件会自动将其添加到请求注册的站点。执行此操作的挂钩是“wpmu\\u validate\\u user\\u signup”。。

// check and add users if already on the network 
add_filter( \'wpmu_validate_user_signup\', \'add_exting_user\' );

/**
 * If users are already registered with the Network then simply add them
 * to this new site. 
 *
 * @return $result or drops out
 */
function add_exting_user( $result ) {

    if ( is_user_logged_in() ) {
        return $result;
    }

    $submitted_user_email = $result[\'user_email\'];
    $original_error = $result[\'errors\'];  

      foreach( $original_error->get_error_codes() as $code ){
         foreach(  $original_error->get_error_messages( $code ) as $message ){  
               if( $code != \'user_email\' && $message == __( \'Sorry, that username already exists!\') ){                    
                    $user = get_user_by( \'email\', $submitted_user_email );
                    $user_id = $user->ID;
                    $blog_id = get_current_blog_id();
                    add_user_to_blog( $blog_id, $user_id, get_site_option( \'default_user_role\', \'subscriber\' ) );
                    $user_blogs = get_blogs_of_user( $user_id );

                    $user_blogs_sorted = array();
                    foreach ( $user_blogs AS $user_blog ) {
                            $user_blogs_sorted[ $user_blog->blogname ] = $user_blog->siteurl;
                    }

                    // A real quick way to do a case-insensitive sort of an array keyed by strings: 
                    uksort($user_blogs_sorted , "strnatcasecmp");

                    $html = "<h1>";
                    $html .= sprintf(  __(\'Hi %1$s you have been added to this site, your current sites on the Network are:\', \'network-subsite-user-registration\' ), "<strong>$submitted_user_email</Strong>" );
                    $html .= "</h1></Br><ul>";
                    foreach ( $user_blogs_sorted AS $sitename => $siteurl ) {
                        if ( ! is_main_site( $user_blog->userblog_id ) ) {
                                    $html .=  \'<li><h2><strong><a href="\' . wp_login_url($siteurl )   . \'" target="_blank" >\' . $sitename  . \'</a></strong></h2></li>\';
                            }
                    }
                    $html .= "</ul>";    

                    die( $html );

               }
         }
    }   

    return $result;  

}

相关推荐

Remove node from multisites?

我有一个如下所示的功能,其目标是从“我的网站”下拉列表中删除新帖子并管理评论。如果我将{$node\\u id}替换为blogs id,这会很好地工作。但我希望这适用于“我的站点”列表中的所有多站点。这意味着我需要获得所有的博客id。这是我已经取得的成就,但它不起作用。add_action( \'admin_bar_menu\', \'remove_nodes_from_mysites\', 999 ); function remove_nodes_from_mysites( $wp_admin_