Enviar correo electrónico de activación del usuario al crear un usuario mediante programación

9

Me preguntaba si alguien aquí podría ayudarme.

Básicamente, he creado un formulario de registro personalizado que, cuando se valida, inserta a un usuario en la tabla de usuarios.

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);
} 

Ahora, lo que necesito que haga es en lugar de enviar el correo electrónico de confirmación que sé que puedo hacer con el siguiente código.

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

Quiero enviar un correo electrónico de activación de usuario en su lugar. He intentado algunas cosas pero parece que no puedo encontrar nada concreto. Esperando que alguien haya tenido este problema antes.

Joe Buckle
fuente

Respuestas:

10

Para lograr el proceso de activación del usuario, debe seguir los siguientes pasos:

  1. después de crear un nuevo usuario, agregue un campo de usuario personalizado que indica que este usuario debe activar su cuenta
  2. envíe un correo electrónico con el código de activación, proporcione un enlace en este correo electrónico a una página donde se activará el usuario
  3. implementar la página de activación
  4. cuando el usuario intente iniciar sesión, verifique si ese campo de usuario personalizado existe o no. Si existe, no inicie sesión y muestre un mensaje de error de activación.

Agregar campo personalizado y enviar correo electrónico:

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 );
    }
}

Verifique la activación del usuario al iniciar sesión:

// 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;

Página de activación:

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' );
            }
        }
    }
}

Este es su punto de partida, continúe y ajústelo a sus necesidades.

Eugene Manuilov
fuente
Buen post. Pero creo que te perdiste una cosa. Cuando evita que usuarios no autorizados inicien sesión, ¿cómo puede obtener el user_id de get_current_user_id () en la página de activación?
s1lv3r
1
maldición ... :) buen punto, lo arreglará en un minuto :)
Eugene Manuilov
Gracias por esta fantástica información. Estaba viendo si había alguna solución central para activar el envío de un correo electrónico de activación, ya que puede 'reenviar la activación' en el panel de administración. Pensé que al insertar un usuario como pendiente podría generarse un código de activación e insertarse en la base de datos, pero luego de una inspección más profunda descubrí que 'obviamente' no había suerte :) De todos modos. Todo tiene sentido y gracias de nuevo.
Joe Buckle
@ JoeBuckle Eso es extraño. No debería tener un resend activationenlace en absoluto en una instalación de vainilla. ¿Ya tienes un plugin instalado para esto? Además, BuddyPress viene con una funcionalidad de activación de usuario lista para usar.
s1lv3r
@ s1lv3r ¿Podría tener algo que ver con Theme-My-Login?
Joe Buckle
1

Dos opciones para elegir:

  1. Use un complemento, por ejemplo, Correo electrónico de activación del usuario o Aprobación de nuevo usuario

  2. Codifique esto usted mismo.

Algunas funciones que deberían ayudarlo a comenzar:

  • wp_mail () para enviar el correo electrónico,
  • add_user_meta () para guardar una clave de activación para el usuario,
  • genere un enlace que contenga la clave y colóquelo en el correo electrónico, cree una página en wordpress que capture su parámetro clave (por ejemplo, usando add_shortcode () ),
  • use get_user_meta () para verificar la clave de activación contra la almacenada en la base de datos, coloque otra meta clave de usuario para marcar a este usuario como activado si tiene éxito,
  • agregue una función al filtro de autenticación para evitar que cualquier usuario que no esté activado inicie sesión.
s1lv3r
fuente
0

Puede obtener el user_id haciendo esto mientras se realiza la autenticación:

$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
fuente