Enviar correo electrónico de activación de usuario cuando se crea un usuario programáticamente

9

Me pregunté si alguien aquí podría ayudar.

Básicamente, he creado un formulario de registro personalizado que, cuando se valida, inserta 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 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']);

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

    
pregunta Joe Buckle 11.10.2013 - 14:45

3 respuestas

9

Para llevar a cabo el proceso de activación del usuario, debe realizar los siguientes pasos:

  1. después de crear un nuevo usuario, agregue un campo de usuario personalizado que indique que este usuario tiene que 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 intenta iniciar sesión, compruebe si ese campo de usuario personalizado existe o no. Si existe, no inicie sesión y muestre un mensaje de error de activación.

Agrega un campo personalizado y envía un 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 );
    }
}

Comprobar 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, siga adelante y ajústelo a sus necesidades.

    
respondido por el Eugene Manuilov 11.10.2013 - 15:42
1

Dos opciones para elegir:

  1. Use un complemento, por ejemplo correo electrónico de activación del usuario o New User Approve

  2. Codifica esto tú mismo.

Algunas funciones que deberían ayudarte 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 atrape su clave-param (por ejemplo, utilizando add_shortcode () ),
  • use get_user_meta () para comparar la clave de activación con la almacenada en la base de datos, coloque otra clave meta del usuario para marque este usuario como activado si tiene éxito,
  • agregue una función al filtro authenticate para evitar que cualquier usuario que no esté activado inicie sesión.
respondido por el s1lv3r 11.10.2013 - 15:47
0

Puedes obtener el user_id haciendo esto mientras autenticas:

$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...
}
    
respondido por el Dasbairgaya 16.05.2017 - 10:03

Lea otras preguntas en las etiquetas