Senden Sie eine Benutzeraktivierungs-E-Mail, wenn Sie programmgesteuert einen Benutzer erstellen

9

Ich fragte mich, ob hier jemand helfen könnte.

Grundsätzlich habe ich ein benutzerdefiniertes Registrierungsformular erstellt, das bei der Validierung einen Benutzer in die Benutzertabelle einfügt.

function _new_user($data) {

    // Separate Data
    $default_newuser = array(
        'user_pass' =>  wp_hash_password( $data['user_pass']),
        'user_login' => $data['user_login'],
        'user_email' => $data['user_email'],
        'first_name' => $data['first_name'],
        'last_name' => $data['last_name'],
        'role' => 'pending'
    );

    wp_insert_user($default_newuser);
} 

Jetzt muss ich nicht mehr die Bestätigungs-E-Mail senden, von der ich weiß, dass ich sie mit dem folgenden Code ausführen kann.

wp_new_user_notification($user_id, $data['user_pass']);

Ich möchte stattdessen eine Benutzeraktivierungs-E-Mail senden. Ich habe ein paar Dinge ausprobiert, aber ich kann anscheinend nichts Konkretes finden. Ich hoffe, jemand hatte dieses Problem schon einmal.

Joe Buckle
quelle

Antworten:

10

Um den Benutzeraktivierungsprozess durchzuführen, müssen Sie die folgenden Schritte ausführen:

  1. Fügen Sie nach dem Erstellen eines neuen Benutzers ein benutzerdefiniertes Benutzerfeld hinzu, das angibt, dass dieser Benutzer sein Konto aktivieren muss
  2. Senden Sie eine E-Mail mit Aktivierungscode und geben Sie in dieser E-Mail einen Link zu einer Seite an, auf der der Benutzer aktiviert wird
  3. Aktivierungsseite implementieren
  4. Wenn der Benutzer versucht, sich anzumelden, prüfen Sie, ob dieses benutzerdefinierte Benutzerfeld vorhanden ist oder nicht. Wenn es existiert, melden Sie ihn nicht an und zeigen Sie stattdessen eine Aktivierungsfehlermeldung an.

Benutzerdefiniertes Feld hinzufügen und E-Mail senden:

function _new_user($data) {

    // Separate Data
    $default_newuser = array(
        'user_pass' =>  wp_hash_password( $data['user_pass']),
        'user_login' => $data['user_login'],
        'user_email' => $data['user_email'],
        'first_name' => $data['first_name'],
        'last_name' => $data['last_name'],
        'role' => 'pending'
    );

    $user_id = wp_insert_user($default_newuser);
    if ( $user_id && !is_wp_error( $user_id ) ) {
        $code = sha1( $user_id . time() );
        $activation_link = add_query_arg( array( 'key' => $code, 'user' => $user_id ), get_permalink( /* YOUR ACTIVATION PAGE ID HERE */ ));
        add_user_meta( $user_id, 'has_to_be_activated', $code, true );
        wp_mail( $data['user_email'], 'ACTIVATION SUBJECT', 'CONGRATS BLA BLA BLA. HERE IS YOUR ACTIVATION LINK: ' . $activation_link );
    }
}

Überprüfen Sie die Benutzeraktivierung beim Anmelden:

// override core function
if ( !function_exists('wp_authenticate') ) :
function wp_authenticate($username, $password) {
    $username = sanitize_user($username);
    $password = trim($password);

    $user = apply_filters('authenticate', null, $username, $password);

    if ( $user == null ) {
        // TODO what should the error message be? (Or would these even happen?)
        // Only needed if all authentication handlers fail to return anything.
        $user = new WP_Error('authentication_failed', __('<strong>ERROR</strong>: Invalid username or incorrect password.'));
    } elseif ( get_user_meta( $user->ID, 'has_to_be_activated', true ) != false ) {
        $user = new WP_Error('activation_failed', __('<strong>ERROR</strong>: User is not activated.'));
    }

    $ignore_codes = array('empty_username', 'empty_password');

    if (is_wp_error($user) && !in_array($user->get_error_code(), $ignore_codes) ) {
        do_action('wp_login_failed', $username);
    }

    return $user;
}
endif;

Aktivierungsseite:

add_action( 'template_redirect', 'wpse8170_activate_user' );
function wpse8170_activate_user() {
    if ( is_page() && get_the_ID() == /* YOUR ACTIVATION PAGE ID HERE */ ) {
        $user_id = filter_input( INPUT_GET, 'user', FILTER_VALIDATE_INT, array( 'options' => array( 'min_range' => 1 ) ) );
        if ( $user_id ) {
            // get user meta activation hash field
            $code = get_user_meta( $user_id, 'has_to_be_activated', true );
            if ( $code == filter_input( INPUT_GET, 'key' ) ) {
                delete_user_meta( $user_id, 'has_to_be_activated' );
            }
        }
    }
}

Dies ist Ihr Ausgangspunkt. Passen Sie ihn an Ihre Bedürfnisse an.

Eugene Manuilov
quelle
Guter Post. Aber ich denke, Sie haben eine Sache verpasst. Wenn Sie verhindern, dass sich nicht autorisierte Benutzer anmelden, wie können Sie die Benutzer-ID von get_current_user_id () auf der Aktivierungsseite abrufen?
s1lv3r
1
verdammt ... :) guter Punkt, wird es in einer Minute beheben :)
Eugene Manuilov
Vielen Dank für diese fantastische Information. Ich habe gesehen, ob es eine Kernlösung gibt, um nur das Senden einer Aktivierungs-E-Mail auszulösen, da Sie die Aktivierung im Admin-Bereich erneut senden können. Ich dachte, dass durch das Einfügen eines Benutzers als ausstehend ein Aktivierungscode generiert und in die Datenbank eingefügt werden könnte, aber bei weiterer Überprüfung stellte ich fest, dass "offensichtlich" kein solches Glück vorliegt :) Wie auch immer. Es macht alles Sinn und nochmals vielen Dank.
Joe Buckle
@ JoeBuckle Das ist seltsam. Sie sollten resend activationbei einer Vanilla-Installation überhaupt keinen Link haben. Haben Sie dafür bereits ein Plugin installiert? BuddyPress verfügt auch über eine sofort einsatzbereite Benutzeraktivierungsfunktion.
s1lv3r
@ s1lv3r Könnte es etwas mit Theme-My-Login zu tun haben?
Joe Buckle
1

Zwei Optionen zur Auswahl:

  1. Verwenden Sie ein Plugin, z. B. eine E-Mail zur Benutzeraktivierung oder eine Genehmigung für neue Benutzer

  2. Codieren Sie dies selbst.

Einige Funktionen, mit denen Sie beginnen sollten:

  • wp_mail () , um die E-Mail zu senden,
  • add_user_meta () , um einen Aktivierungsschlüssel für den Benutzer zu speichern,
  • Generieren Sie einen Link mit dem Schlüssel und platzieren Sie ihn in der E-Mail. Erstellen Sie eine Seite in WordPress, die Ihren Schlüsselparameter abfängt (z. B. mit add_shortcode () ).
  • Verwenden Sie get_user_meta () , um den Aktivierungsschlüssel mit dem in der Datenbank gespeicherten zu vergleichen. Platzieren Sie einen anderen Benutzer-Metaschlüssel, um diesen Benutzer bei Erfolg als aktiviert zu markieren.
  • Fügen Sie dem Authentifizierungsfilter eine Funktion hinzu, um zu verhindern, dass sich Benutzer anmelden, die nicht aktiviert sind.
s1lv3r
quelle
0

Sie können die Benutzer-ID erhalten, indem Sie dies während der Authentifizierung tun:

$username='user email provided by the user at login panel.';
$results = $wpdb->get_row( "SELECT ID FROM wp_users WHERE user_email='".$username."'");
   $activation_id = $results->ID;
   $activation_key =  get_user_meta( $activation_id, 'has_to_be_activated', true );
 if($activation_key != false )
 {
  echo '<h4 class="error">Your account has not been activated yet.<br /> To activate it check your email and clik on the activation link.</h4>';
 }
else{
//authenticate your user login here...
}
Dasbairgaya
quelle