Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wordpress 如何为WooCommerce添加电子邮件验证功能_Wordpress_Woocommerce - Fatal编程技术网

Wordpress 如何为WooCommerce添加电子邮件验证功能

Wordpress 如何为WooCommerce添加电子邮件验证功能,wordpress,woocommerce,Wordpress,Woocommerce,我想在用户注册WooCommerce时添加电子邮件验证程序。WordPress然后通过电子邮件向用户的电子邮件发送验证链接。如果单击链接,则会激活用户的帐户。我将如何做到这一点?我使用了由提供的代码,并对其进行了改进,以包括额外的检查和功能,如在用户帐户被激活后自动登录,从而获得更流畅的用户体验 更新:与原始代码不同,此代码也不需要任何现有用户确认其电子邮件地址 与我基于它的代码一样,它设计用于运行WooCommerce的WordPress安装。如果您禁用了标准WordPress注册页面,它也可

我想在用户注册WooCommerce时添加电子邮件验证程序。WordPress然后通过电子邮件向用户的电子邮件发送验证链接。如果单击链接,则会激活用户的帐户。我将如何做到这一点?

我使用了由提供的代码,并对其进行了改进,以包括额外的检查和功能,如在用户帐户被激活后自动登录,从而获得更流畅的用户体验

更新:与原始代码不同,此代码也不需要任何现有用户确认其电子邮件地址

与我基于它的代码一样,它设计用于运行WooCommerce的WordPress安装。如果您禁用了标准WordPress注册页面,它也可以工作

您需要一个带有URL
yoursite.com/verify/
的空页面,该页面构建在一个包含
内容容器的模板上。它将替换原始代码中的
/sign-in/
目的地,并将处理由该代码创建的几乎所有消息

接下来,将以下代码添加到主题的functions.php中:

function wc_registration_redirect( $redirect_to ) {     // prevents the user from logging in automatically after registering their account
    wp_logout();
    wp_redirect( '/verify/?n=');                        // redirects to a confirmation message
    exit;
}

function wp_authenticate_user( $userdata ) {            // when the user logs in, checks whether their email is verified
    $has_activation_status = get_user_meta($userdata->ID, 'is_activated', false);
    if ($has_activation_status) {                           // checks if this is an older account without activation status; skips the rest of the function if it is
        $isActivated = get_user_meta($userdata->ID, 'is_activated', true);
        if ( !$isActivated ) {
            my_user_register( $userdata->ID );              // resends the activation mail if the account is not activated
            $userdata = new WP_Error(
                'my_theme_confirmation_error',
                __( '<strong>Error:</strong> Your account has to be activated before you can login. Please click the link in the activation email that has been sent to you.<br /> If you do not receive the activation email within a few minutes, check your spam folder or <a href="/verify/?u='.$userdata->ID.'">click here to resend it</a>.' )
            );
        }
    }
    return $userdata;
}

function my_user_register($user_id) {               // when a user registers, sends them an email to verify their account
    $user_info = get_userdata($user_id);                                            // gets user data
    $code = md5(time());                                                            // creates md5 code to verify later
    $string = array('id'=>$user_id, 'code'=>$code);                                 // makes it into a code to send it to user via email
    update_user_meta($user_id, 'is_activated', 0);                                  // creates activation code and activation status in the database
    update_user_meta($user_id, 'activationcode', $code);
    $url = get_site_url(). '/verify/?p=' .base64_encode( serialize($string));       // creates the activation url
    $html = ( 'Please click <a href="'.$url.'">here</a> to verify your email address and complete the registration process.' ); // This is the html template for your email message body
    wc_mail($user_info->user_email, __( 'Activate your Account' ), $html);          // sends the email to the user
}

function my_init(){                                 // handles all this verification stuff
    if(isset($_GET['p'])){                                                  // If accessed via an authentification link
        $data = unserialize(base64_decode($_GET['p']));
        $code = get_user_meta($data['id'], 'activationcode', true);
        $isActivated = get_user_meta($data['id'], 'is_activated', true);    // checks if the account has already been activated. We're doing this to prevent someone from logging in with an outdated confirmation link
        if( $isActivated ) {                                                // generates an error message if the account was already active
            wc_add_notice( __( 'This account has already been activated. Please log in with your username and password.' ), 'error' );
        }
        else {
            if($code == $data['code']){                                     // checks whether the decoded code given is the same as the one in the data base
                update_user_meta($data['id'], 'is_activated', 1);           // updates the database upon successful activation
                $user_id = $data['id'];                                     // logs the user in
                $user = get_user_by( 'id', $user_id ); 
                if( $user ) {
                    wp_set_current_user( $user_id, $user->user_login );
                    wp_set_auth_cookie( $user_id );
                    do_action( 'wp_login', $user->user_login, $user );
                }
                wc_add_notice( __( '<strong>Success:</strong> Your account has been activated! You have been logged in and can now use the site to its full extent.' ), 'notice' );
            } else {
                wc_add_notice( __( '<strong>Error:</strong> Account activation failed. Please try again in a few minutes or <a href="/verify/?u='.$userdata->ID.'">resend the activation email</a>.<br />Please note that any activation links previously sent lose their validity as soon as a new activation email gets sent.<br />If the verification fails repeatedly, please contact our administrator.' ), 'error' );
            }
        }
    }
    if(isset($_GET['u'])){                                          // If resending confirmation mail
        my_user_register($_GET['u']);
        wc_add_notice( __( 'Your activation email has been resent. Please check your email and your spam folder.' ), 'notice' );
    }
    if(isset($_GET['n'])){                                          // If account has been freshly created
        wc_add_notice( __( 'Thank you for creating your account. You will need to confirm your email address in order to activate your account. An email containing the activation link has been sent to your email address. If the email does not arrive within a few minutes, check your spam folder.' ), 'notice' );
    }
}

// the hooks to make it all work
add_action( 'init', 'my_init' );
add_filter('woocommerce_registration_redirect', 'wc_registration_redirect');
add_filter('wp_authenticate_user', 'wp_authenticate_user',10,2);
add_action('user_register', 'my_user_register',10,2);
在本例中,如果检测到用户的语言代码为
de
(如果它是类似
de_de_formal
的变体,也可以工作),则将输出德语消息,否则将输出英语消息


编辑:我更新了代码,不要求现有用户追溯确认他们的电子邮件地址。

但此插件中存在一个问题,没有在wordpress中添加用户。堆栈溢出不是为您编写代码。你必须详细说明问题所在。代码。截图。预期和实际结果。一个好问题不应该只有一句话。不,我不能,因为你没有提供足够的细节。没有细节,很难回答你的问题,因为在你提供细节之前我们无法找到答案。对不起,我不打算注册。您需要花时间提供更多详细信息。:)一旦你这么做了,我会非常高兴地看看你的问题,看看我是否有一个解决方案。你不需要从Github下载插件,这可能是你下载的问题,直接转到这个链接下载插件这很好,但我花了一段时间才弄明白“一个基于模板的空页面”事情在我发现以下情况后,这是非常有意义的:我的WC商店有两个注册选项:普通和Facebook。此代码会影响在Facebook注册的用户吗?@DemuriCelidze此代码通过
user\u register
init
wp\u authenticate\u user
与WooCommerce内核挂钩,并通过
WooCommerce\u registration\u redirect
,进入WooCommerce,因此,除非你的Facebook注册与WooCommerce流程挂钩,而不是直接与WordPress core挂钩,否则该代码可能无法与Facebook注册一起使用。代码中存在一个小安全问题:任何人都可以通过如下链接停用任何帐户,如/?u=1。因此,需要检查用户是否已经激活,例如在第58行。我提交了一份编辑报告。
if(ICL_LANGUAGE_CODE=='de'){
    wc_add_notice( __( 'German error message' ), 'error' );
} else {
    wc_add_notice( __( 'English error message' ), 'error' );
}