Wie kann ich E-Mail-Verifizierungsfunktionen für WooCommerce hinzufügen

Lesezeit: 7 Minuten

Benutzeravatar von Amit Kashyap
Amit Kashyap

Ich möchte ein E-Mail-Verifizierungsverfahren hinzufügen, wenn sich der Benutzer in WooCommerce registriert. WordPress sendet dann einen Bestätigungslink per E-Mail an die E-Mail-Adresse des Benutzers. Wenn auf den Link geklickt wird, wird das Konto des Benutzers aktiviert. Wie würde ich das machen?

  • Aber es gibt ein Problem in diesem Plugin, das keinen Benutzer in WordPress hinzufügt.

    – Amit Kashyap

    17. Juli 2016 um 7:04 Uhr

  • Stack Overflow soll keinen Code für Sie schreiben. Sie müssen sehr genau angeben, was das Problem ist. Code. Screenshots. Erwartete und tatsächliche Ergebnisse. Eine gute Frage sollte selten 1 Satz sein.

    – Charlie Fisch

    17. Juli 2016 um 7:05 Uhr

  • Nein, kann ich nicht, weil Sie nicht genug Details angegeben haben. Ohne Details ist es SEHR schwierig, Ihre Frage zu beantworten, da wir die Antwort erst finden können, wenn Sie Details angeben.

    – Charlie Fisch

    17. Juli 2016 um 7:09 Uhr

  • Tut mir leid, aber ich werde mich nicht registrieren. Sie müssen sich die Zeit nehmen, um weitere Details anzugeben. 🙂 Sobald Sie das tun, würde ich mich gerne mit Ihrer Frage befassen und sehen, ob ich eine Lösung für Sie habe.

    – Charlie Fisch

    17. Juli 2016 um 7:14 Uhr

  • Sie müssen das Plugin nicht von Github herunterladen, es kann das Problem mit Ihrem Download sein, gehen Sie einfach direkt zu diesem Link, um das Plugin herunterzuladen wordpress.org/plugins/woo-confirmation-email

    – RKBhardwaj

    17. Juli 2016 um 7:54 Uhr

Benutzeravatar von Rafael Winniger
Raffael Winniger

Ich habe den von Amit Kayshap bereitgestellten Code verwendet und ihn verfeinert, um zusätzliche Überprüfungen und Funktionen wie das automatische Anmelden eines Benutzers nach der Aktivierung seines Kontos einzuschließen, was zu einer viel reibungsloseren Benutzererfahrung führt.

Aktualisieren: Im Gegensatz zum ursprünglichen Code erfordert dieser nicht, dass ein bestehender Benutzer auch seine E-Mail-Adresse bestätigt.

Wie der Code, auf dem ich es basiert, ist es so konzipiert, dass es auf einer WordPress-Installation läuft, auf der WooCommerce läuft. Es funktioniert auch, wenn Sie die standardmäßige WordPress-Registrierungsseite deaktiviert haben.

Sie benötigen eine leere Seite mit der URL yoursite.com/verify/ das auf einer Vorlage aufbaut, die enthält <?php wc_print_notices(); ?> innerhalb seines Inhaltscontainers. Es ersetzt die /sign-in/ Ziel aus dem ursprünglichen Code und verarbeitet fast alle Nachrichten, die von diesem Code erstellt wurden.

Fügen Sie als Nächstes diesen Code zur functions.php Ihres Themes hinzu:

function wc_registration_redirect( $redirect_to ) {     // prevents the user from logging in automatically after registering their account
    wp_logout();
    wp_redirect( '/verify/?n=1');                       // 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);

Wenn Sie eine mehrsprachige Website betreiben, können Sie den Code ganz einfach übersetzungsbereit machen. Ändern Sie einfach die Textzeichenfolgen wie folgt: __( 'Text you want to translate', 'your-theme' ) Dadurch können Übersetzungs-Plugins wie WPML die Zeichenfolge zu einer Übersetzungstabelle in der hinzufügen your-theme Textdomäne.

Beachten Sie, dass jede Zeichenfolge, die eine Variable enthält, wie z .$url. generiert jedes Mal eine neue Zeichenfolge, wenn ein anderer Benutzer seine Funktion aktiviert. Um dies zu umgehen (und String-Spamming in Ihre Datenbank zu verhindern), können wir sie direkt in den Code übersetzen:

if(ICL_LANGUAGE_CODE=='de'){
    wc_add_notice( __( 'German error message' ), 'error' );
} else {
    wc_add_notice( __( 'English error message' ), 'error' );
}

In diesem Beispiel wird die deutsche Nachricht ausgegeben, wenn der Sprachcode des Benutzers als erkannt wird de (Funktioniert auch, wenn es sich um eine Variation wie z de_DE_formal), andernfalls wird die englische Nachricht ausgegeben.

Bearbeiten: Ich habe den Code aktualisiert, sodass ein bestehender Benutzer seine E-Mail-Adresse nicht rückwirkend bestätigen muss.

  • Das funktioniert großartig, aber ich habe eine Weile gebraucht, um das Ding “eine leere Seite, die auf einer Vorlage aufbaut” herauszufinden. Es macht absolut Sinn, nachdem ich Folgendes gefunden habe: stackoverflow.com/a/2810723/1358863

    – Asususer

    22. Januar 2019 um 9:05 Uhr

  • Ich habe 2 Registrierungsmöglichkeiten in meinem WC-Shop: normal und Facebook. Wirkt sich dieser Code auf Benutzer aus, die sich bei Facebook registrieren?

    – Demuri Celidze

    20. Februar 2019 um 14:52 Uhr

  • @DemuriCelidze Dieser Code hakt sich in den WordPress-Kern ein user_register, init und wp_authenticate_user und in WooCommerce mit woocommerce_registration_redirectwenn also Ihre Facebook-Registrierung nicht direkt in den WordPress-Kern, sondern in den WooCommerce-Prozess eingebunden wird, funktioniert der Code wahrscheinlich nicht mit der Facebook-Registrierung.

    – Raffael Winniger

    21. Februar 2019 um 15:14 Uhr

  • Es gibt ein kleines Sicherheitsproblem im Code: Jeder kann jedes Konto deaktivieren, indem er einfach einem Link wie /?u=1 folgt. Überprüfen Sie also, ob der Benutzer bereits aktiviert ist, beispielsweise in Zeile 58. Ich habe eine Änderung eingereicht.

    – dauerhaft

    26. September 2020 um 15:55 Uhr


1391180cookie-checkWie kann ich E-Mail-Verifizierungsfunktionen für WooCommerce hinzufügen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy