Lesefortschritt:

    Memberbereich-Special – Trick #1: Double-Opt-In für neue Word­Press-User

    1. November 2026 | functions.php, Sicherheit, Word­Press

    Trick # 627 | Dieser Beitrag beinhaltet 0 Wörter. – Geschätzte Lesezeit: ca. 0 Minuten.

    Ein Memberbereich auf der Website bietet zahlreiche Vorteile: Von exklusiven Inhalten bis hin zu personalisierten Funktionen für registrierte BenutzerInnen. Damit dieser Bereich reibungslos funktioniert, ist es wichtig, grundlegende Sicherheits- und Benutzerfreundlichkeitsaspekte zu beachten. Mit unserer Special-Reihe zeigen wir Ihnen einige Tricks. Heute etwa, wie Sie die Userregistrierung von Word­Press um eine Double-Opt-In-Funktion erweitern.

    Die Registration neuer BenutzerInnen funktioniert in Word­Press ohne grosse Kontrolle. Besonders, wenn Sie jedoch die Selbstregistration zulassen, kann das zu Ärger führen, weil sich auch Spam-Bots eintragen oder User falsche Mailadressen angeben. Mit einem Double-Opt-In schalten Sie diese Probleme aus.

    Dazu haben wir diesen Code kreiert. Kopieren Sie ihn in die Datei functions.php Ihrer Word­Press-Installation. Geht ganz einfach: im Backend unter Design/Theme-Datei-Editor:

    // Schritt 1: Token für Benutzer erstellen und speichern
    add_action('user_register', 'send_optin_email');
    
    function send_optin_email($user_id) {
        $user = get_userdata($user_id);
        $token = wp_generate_password(20, false);
        
        // Token und Verifizierungsstatus als Benutzer-Meta speichern
        update_user_meta($user_id, 'email_verification_token', $token);
        update_user_meta($user_id, 'email_verified', false);
        
        // Verifizierungslink generieren
        $verification_link = add_query_arg(
            [
                'token' => $token,
                'user_id' => $user_id,
            ],
            home_url('/verify-email/')
        );
        
        // Vor- und Nachname abrufen
        $first_name = $user->first_name;
        $last_name = $user->last_name;
        
        // E-Mail senden
        $subject = 'Bitte bestätigen Sie Ihre E-Mail-Adresse';
        $message = "Hallo " . $first_name . " " . $last_name . "\n\nDanke für Ihre Registration. Bitte bestätigen Sie Ihre E-Mail-Adresse, indem Sie auf den folgenden Link klicken:\n\n" . $verification_link . "\n\nVielen Dank.\n\nBeste Grüsse";
        $headers = ['Content-Type: text/plain; charset=UTF-8'];
        
        wp_mail($user->user_email, $subject, $message, $headers);
    }
    
    // Schritt 2: Verifizierungsseite einrichten
    add_action('init', function() {
        add_rewrite_rule('^verify-email/?$', 'index.php?verify_email=1', 'top');
        add_rewrite_tag('%verify_email%', '1');
    });
    
    add_action('template_redirect', function() {
        if (get_query_var('verify_email')) {
            verify_email_token();
            exit;
        }
    });
    
    function verify_email_token() {
        if (!isset($_GET['token']) || !isset($_GET['user_id'])) {
            echo 'Ungültige Anfrage. <a href="https://ihre-domain.ch">Zurück zur Hauptseite</a>';
            exit;
        }
        
        $token = sanitize_text_field($_GET['token']);
        $user_id = intval($_GET['user_id']);
        $saved_token = get_user_meta($user_id, 'email_verification_token', true);
        
        if ($token === $saved_token) {
            // Verifizierung erfolgreich
            update_user_meta($user_id, 'email_verified', true);
            delete_user_meta($user_id, 'email_verification_token');
            
            echo 'Vielen Dank! Ihr Account wurde erfolgreich bestätigt.<br><br>';
            echo '<a href="https://ihre-domain.ch">Zurück zur Hauptseite</a>';
        } else {
            // Verifizierung fehlgeschlagen
            echo 'Ungültiger oder abgelaufener Verifizierungslink.<br><br>';
            echo '<a href="https://ihre-domain.ch">Zurück zur Hauptseite</a>';
        }
    }
    
    // Schritt 3: Überprüfen, ob die E-Mail verifiziert ist
    add_action('wp_login', 'check_email_verification', 10, 2);
    
    function check_email_verification($user_login, $user) {
        $email_verified = get_user_meta($user->ID, 'email_verified', true);
        if (!$email_verified) {
            wp_logout();
            wp_die(
                'Sie müssen Ihre E-Mail-Adresse bestätigen, bevor Sie sich anmelden können.<br><br>' .
                '<a href="https://ihre-domain.ch">Zurück zur Hauptseite</a>',
                'Anmeldung nicht möglich',
                ['response' => 403]
            );
        }
    }
    
    // Schritt 4: Alte Tokens bereinigen und inaktive User löschen
    add_action('email_verification_cleanup', function() {
        $users = get_users([
            'meta_key' => 'email_verification_token',
            'meta_compare' => 'EXISTS'
        ]);
        
        foreach ($users as $user) {
            $created_at = strtotime($user->user_registered);
            if (time() - $created_at > 7 * DAY_IN_SECONDS) { // Token älter als 7 Tage
                // Benutzer vollständig löschen
                wp_delete_user($user->ID);
            }
        }
    });
    
    // Cronjob für Bereinigung einrichten
    if (!wp_next_scheduled('email_verification_cleanup')) {
        wp_schedule_event(time(), 'daily', 'email_verification_cleanup');
    }

    Ab sofort werden neu erfasste User (egal ob im Backend oder auf der Live-Seite erfasst) ein Mail mit Bestätigungslink erhalten. Wird dieser Link nicht angeklickt, wird der Account auch nicht nutzbar sein. User, welche während sieben Tagen nicht auf ihren Maillink klicken, werden im Anschluss wieder aus der Datenbank entfernt. Auf diese Weise sollten Sie keine «Leichen» in der Benutzverwaltung haben.

    Anpassungen sind im Code an einigen Stellen möglich und sicher durchaus sinnvoll:

    • Auf den Zeilen 26 und 27 wird der Mailbetreff und der-text generiert. Da können Sie einen passenderen Text eintragen.
      >>> Hinweis: Zeilenschaltungen erreichen Sie mit \n.
    • Auf Zeile 48 folgt eine Fehlermeldung, wenn was schiefläuft. Diese können Sie anpassen – mindestens aber die Domain im «Retourlink» adaptieren.
    • Die Zeilen 61 und 62 erscheinen, wenn die Verifizierung geklappt hat. Auch diese Meldung können Sie anpassen und insbesondere die Domain des dargestellten Links ändern.
    • Desgleichen bei den Zeilen 65 und 66. Diese Meldung erscheint, wenn der Verifizierungslink zu alt (in unserem Fall älter als 7 Tage) ist.
      >>> Auch hier: Zieldomain des Retourlinks anpassen.
    • Auf Zeile 78 bis 80 wird noch jener Text generiert, der bei einem zu frühen Login – also noch VOR der Verifizierung erscheint. Auch hier ist die URL des Retourlinks noch eine allgemeine.
    • Und letztlich lässt sich auf Zeile 95 die Gültigkeitsdauer des Verifizierungslinks definieren. Bei uns bleibt der für sieben Tage gültig und wird dann gelöscht.
      >>> Sie können da gerne eine beliebige andere Anzahl Tage eintragen.

    Werbung

    Keine Inhalte gefunden.

    Werbung

     

    Pin It on Pinterest

    Share This
    Überblick über den Datenschutz

    Diese Website verwendet Cookies, damit wir Ihnen die bestmögliche Benutzererfahrung bieten können. Cookie-Informationen werden in Ihrem Browser gespeichert und dienen dazu, Sie wiederzuerkennen, wenn Sie auf unsere Website zurückkehren, und unserem Team zu helfen, zu verstehen, welche Bereiche der Website Sie am interessantesten und nützlichsten finden.