WordPress как на ладони
wordpress jino

Как изменить письмо при смене пароля из личного кабинета

Добрый день!

Столкнулся с такой проблемой: необходимо на сайте изменить все стандартные письма (регистрация, сброс пароля, смена пароля из личного кабинета) сделать html.

С письмом регистрации и сброса пароля я справился, а вот письмо, которое приходит при смене пароля пользователем из личного кабинета, я не могу изменить.

Буду весьма благодарен за подсказку как это сделать.

Заранее спасибо! smile

0
Denis 1.1 года назад
  • 1
    Kama4489

    Для этого, нужно создать плагин в котором определить следующие функции. Они отвечают за то как письма будут выглядеть. Все такие функции находятся в файле wp-includes/pluggable.php

    Вот нужные вам функции:

    /**
     * Notify the blog admin of a user changing password, normally via email.
     *
     * @since 2.7.0
     *
     * @param WP_User $user User object.
     */
    function wp_password_change_notification( $user ) {
    	// send a copy of password change notification to the admin
    	// but check to see if it's the admin whose password we're changing, and skip this
    	if ( 0 !== strcasecmp( $user->user_email, get_option( 'admin_email' ) ) ) {
    		$message = sprintf(__('Password Lost and Changed for user: %s'), $user->user_login) . "\r\n";
    		// The blogname option is escaped with esc_html on the way into the database in sanitize_option
    		// we want to reverse this for the plain text arena of emails.
    		$blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
    		wp_mail(get_option('admin_email'), sprintf(__('[%s] Password Lost/Changed'), $blogname), $message);
    	}
    }
    
    /**
     * Email login credentials to a newly-registered user.
     *
     * A new user registration notification is also sent to admin email.
     *
     * @since 2.0.0
     * @since 4.3.0 The `$plaintext_pass` parameter was changed to `$notify`.
     * @since 4.3.1 The `$plaintext_pass` parameter was deprecated. `$notify` added as a third parameter.
     *
     * @global wpdb         $wpdb      WordPress database object for queries.
     * @global PasswordHash $wp_hasher Portable PHP password hashing framework instance.
     *
     * @param int    $user_id    User ID.
     * @param null   $deprecated Not used (argument deprecated).
     * @param string $notify     Optional. Type of notification that should happen. Accepts 'admin' or an empty
     *                           string (admin only), or 'both' (admin and user). Default empty.
     */
    function wp_new_user_notification( $user_id, $deprecated = null, $notify = '' ) {
    	if ( $deprecated !== null ) {
    		_deprecated_argument( __FUNCTION__, '4.3.1' );
    	}
    
    	global $wpdb, $wp_hasher;
    	$user = get_userdata( $user_id );
    
    	// The blogname option is escaped with esc_html on the way into the database in sanitize_option
    	// we want to reverse this for the plain text arena of emails.
    	$blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
    
    	$message  = sprintf(__('New user registration on your site %s:'), $blogname) . "\r\n\r\n";
    	$message .= sprintf(__('Username: %s'), $user->user_login) . "\r\n\r\n";
    	$message .= sprintf(__('Email: %s'), $user->user_email) . "\r\n";
    
    	@wp_mail(get_option('admin_email'), sprintf(__('[%s] New User Registration'), $blogname), $message);
    
    	// `$deprecated was pre-4.3 `$plaintext_pass`. An empty `$plaintext_pass` didn't sent a user notifcation.
    	if ( 'admin' === $notify || ( empty( $deprecated ) && empty( $notify ) ) ) {
    		return;
    	}
    
    	// Generate something random for a password reset key.
    	$key = wp_generate_password( 20, false );
    
    	/** This action is documented in wp-login.php */
    	do_action( 'retrieve_password_key', $user->user_login, $key );
    
    	// Now insert the key, hashed, into the DB.
    	if ( empty( $wp_hasher ) ) {
    		require_once ABSPATH . WPINC . '/class-phpass.php';
    		$wp_hasher = new PasswordHash( 8, true );
    	}
    	$hashed = time() . ':' . $wp_hasher->HashPassword( $key );
    	$wpdb->update( $wpdb->users, array( 'user_activation_key' => $hashed ), array( 'user_login' => $user->user_login ) );
    
    	$message = sprintf(__('Username: %s'), $user->user_login) . "\r\n\r\n";
    	$message .= __('To set your password, visit the following address:') . "\r\n\r\n";
    	$message .= '<' . network_site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user->user_login), 'login') . ">\r\n\r\n";
    
    	$message .= wp_login_url() . "\r\n";
    
    	wp_mail($user->user_email, sprintf(__('[%s] Your username and password info'), $blogname), $message);
    }
    

    Также, есть такие фильтры, которые срабатывают во время вызова функции wp_update_user():

    Изменим текст письма при смене пароля:

    add_filter( 'password_change_email', 'change_password_mail_message', 10, 3 );
    function change_password_mail_message( $pass_change_mail, $user, $userdata ){
    	$new_message_txt = __( 'Hi ###USERNAME###,
    
    This notice confirms that your email was changed on ###SITENAME###.
    
    If you did not change your email, please contact the Site Administrator at
    ###ADMIN_EMAIL###
    
    This email has been sent to ###EMAIL###
    
    Regards,
    All at ###SITENAME###
    ###SITEURL###' );
    
    	$pass_change_mail[ 'message' ] = $new_message_txt;
    
    	return $pass_change_mail;
    }

    Изменим текст письма при смене почты:

    add_filter( 'email_change_email', 'email_change_email_message', 10, 3 );
    function email_change_email_message( $email_change_email, $user, $userdata ){
    	$new_message_txt = __( 'Hi ###USERNAME###,
    
    This notice confirms that your email was changed on ###SITENAME###.
    
    If you did not change your email, please contact the Site Administrator at
    ###ADMIN_EMAIL###
    
    This email has been sent to ###EMAIL###
    
    Regards,
    All at ###SITENAME###
    ###SITEURL###' );
    
    	$email_change_email[ 'message' ] = $new_message_txt;
    
    	return $email_change_email;
    }
    Denis 1.1 года назад

    Спасибо большое!!! Выручили!!! smile

    Denis 1.1 года назад

    У меня еще вопрос.
    При замене письма с использованием:

    add_filter( 'password_change_email', 'change_password_mail_message', 10, 3 );
    function change_password_mail_message( $pass_change_mail, $user, $userdata ){
    	$new_message_txt = __( 'Hi ###USERNAME###,
    
    This notice confirms that your email was changed on ###SITENAME###.
    
    If you did not change your email, please contact the Site Administrator at
    ###ADMIN_EMAIL###
    
    This email has been sent to ###EMAIL###
    
    Regards,
    All at ###SITENAME###
    ###SITEURL###' );
    
    	$pass_change_mail[ 'message' ] = $new_message_txt;
    
    	return $pass_change_mail;
    }
    

    у меня текст письма меняется,а вот хедер письма остается неизменным. А мне надо поменять полностью все письмо, потому, что мне необходимо отправлять свертаное письмо, полностью отличное от стандартного.

    Kama 1.1 года назад

    Массив $pass_change_mail кроме элемента message содержит также:

    $email_change_email['to']
    $email_change_email['subject']
    $email_change_email['message']
    $email_change_email['headers']

    Меняй их через фильтр этот.

    Подробнее смотри описание wp_mail()

    Конкретно передается в результате так:

    wp_mail( $email_change_email['to'], sprintf( $email_change_email['subject'], $blog_name ), $email_change_email['message'], $email_change_email['headers'] );
    Denis 1.1 года назад

    Вопрос в том,что я в

    $email_change_email['message']

    вставляю код сверстанного нового письма, а получается не совсем корректно.
    Прилагаю ссылки на скрины письма,которое мне приходит
    https://drive.google.com/open?id=0BzenjffqUMq4NGxLcFJEM003YlU
    https://drive.google.com/open?id=0BzenjffqUMq4a1JvVnFnekk5a2c

    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Регистрация. Вход.