Как изменить письмо при смене пароля из личного кабинета
Добрый день!
Столкнулся с такой проблемой: необходимо на сайте изменить все стандартные письма (регистрация, сброс пароля, смена пароля из личного кабинета) сделать html.
С письмом регистрации и сброса пароля я справился, а вот письмо, которое приходит при смене пароля пользователем из личного кабинета, я не могу изменить.
Буду весьма благодарен за подсказку как это сделать.
Заранее спасибо! 
Для этого, нужно создать плагин в котором определить следующие функции. Они отвечают за то как письма будут выглядеть. Все такие функции находятся в файле 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; }Спасибо большое!!! Выручили!!!
У меня еще вопрос.
При замене письма с использованием:
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; }у меня текст письма меняется,а вот хедер письма остается неизменным. А мне надо поменять полностью все письмо, потому, что мне необходимо отправлять свертаное письмо, полностью отличное от стандартного.
Массив $pass_change_mail кроме элемента message содержит также:
Меняй их через фильтр этот.
Подробнее смотри описание wp_mail()
Конкретно передается в результате так:
Вопрос в том,что я в
вставляю код сверстанного нового письма, а получается не совсем корректно.
Прилагаю ссылки на скрины письма,которое мне приходит
https://drive.google.com/open?id=0BzenjffqUMq4NGxLcFJEM003YlU
https://drive.google.com/open?id=0BzenjffqUMq4a1JvVnFnekk5a2c