Customize Password Reset Email

User
add_filter('retrieve_password_message', function ($message, $key, $user_login, $user_data) {
// Generate the password reset URL
$reset_url = network_site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user_login), 'login');

// Customize the email message
$message = sprintf(
'Hello,
Someone has requested a password reset for your account. If this was you, click the link below to reset your password:
Reset Password
If you didn't request this, you can safely ignore this email.',
esc_url($reset_url)
);

// Set email content type to HTML
add_filter('wp_mail_content_type', function () {
return 'text/html';
});

return $message;
}, 10, 4);
This is not customizeing password reset mail

Assistant
The provided filter modifies the password reset email content, but its success depends on a few factors. Here are potential reasons why it may not be working as intended and how to fix it:

### 1. **Filter Hook Not Being Triggered**
– Confirm that the `retrieve_password_message` filter is applied correctly. If WordPress or a plugin overrides the default password reset email process, your code might not execute.

**Solution:** Ensure no plugins or themes override the password reset logic. Debug by temporarily disabling other plugins or themes.

### 2. **HTML Email Setting Conflicts**
– The `wp_mail_content_type` filter setting might not persist, or another function may reset it.

**Solution:** Detach the filter after it's applied to avoid side effects:

add_filter('retrieve_password_message', function ($message, $key, $user_login, $user_data) {
       $reset_url = network_site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user_login), 'login');

       $message = sprintf(
           '<p>Hello,</p>
            <p>Someone has requested a password reset for your account. If this was you, click the link below to reset your password:</p>
            <p><a href="%s" data-sg-no-track="1">Reset Password</a></p>
            <p>If you didn't request this, you can safely ignore this email.</p>',
           esc_url($reset_url)
       );

       add_filter('wp_mail_content_type', function () {
           return 'text/html';
       });

       // Remove the filter after the email is sent
       add_action('phpmailer_init', function () {
           remove_filter('wp_mail_content_type', '__return_text_html');
       });

       return $message;
   }, 10, 4);

### 3. **HTML Emails Not Being Sent**
– If the server or WordPress configuration doesn't support HTML emails, the email might be sent as plain text.

**Solution:** Verify your email-sending setup supports HTML by testing:

wp_mail('your-email@example.com', 'Test Email', '<strong>This is a test email</strong>', 'Content-Type: text/html');

### 4. **Caching or Object Caching**
– Caching plugins or object cache settings might interfere with filter application.

**Solution:** Clear your WordPress cache and object cache.

### 5. **Testing the Filter**
– Ensure your filter code is loading by testing with a simple `error_log`:

add_filter('retrieve_password_message', function ($message, $key, $user_login, $user_data) {
       error_log('Filter triggered: ' . $user_login);
       return $message;
   }, 10, 4);

### Debugging Steps
1. **Confirm Activation**:
Ensure your code is in the `functions.php` file of the active theme or a custom plugin.

2. **Conflict Testing**:
Temporarily disable plugins and switch to a default theme (e.g., Twenty Twenty-Four).

3. **Alternative Filter**:
If this filter still doesn’t work, try `wp_password_change_notification` or `wp_mail`.

### Example Alternative Approach
You can use the `wp_mail` function directly if the `retrieve_password_message` is being bypassed:

add_filter('retrieve_password', function ($user_login, $key) {
    $reset_url = network_site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user_login), 'login');
    $email = sprintf(
        '<p>Hello,</p>
         <p>Click the link below to reset your password:</p>
         <p><a href="%s">Reset Password</a></p>',
        esc_url($reset_url)
    );
    wp_mail($user_login, 'Password Reset Request', $email, ['Content-Type: text/html']);
});

Try these steps to pinpoint the issue and resolve it. Let me know if you need further clarification!

Leave a Comment

Your email address will not be published. Required fields are marked *