如何在HTML邮件中实现WordPress密码重置链接?
解决WordPress密码重置HTML邮件的参数错误与动态链接问题
1. 修正钩子参数不匹配问题
retrieve_password_message 过滤器在WordPress 5.5及以后版本支持4个参数($message, $key, $user_login, $user_data),你原代码中add_filter的第四个参数(接受参数数量)设为2,导致函数无法接收全部参数引发报错。需要将该参数改为4,让钩子能传递完整参数。
2. 正确构建动态重置链接
字符串拼接时的引号嵌套容易出错,推荐用PHP的Heredoc语法编写HTML内容,无需转义引号,能清晰插入动态变量,避免链接被截断。
3. 限制HTML内容类型的作用范围
全局设置wp_mail_content_type为text/html会影响其他WordPress邮件(比如评论通知、系统通知等),建议仅在发送重置邮件时临时启用,发送后恢复默认类型。
完整修正代码
// 注册密码重置邮件替换钩子,指定接收4个参数 add_filter( 'retrieve_password_message', 'replace_retrieve_password_message', 10, 4 ); function replace_retrieve_password_message( $message, $key, $user_login, $user_data ) { // 临时设置邮件内容类型为HTML add_filter( 'wp_mail_content_type', function() { return 'text/html'; } ); // 生成正确的密码重置链接 $reset_link = network_site_url( "wp-login.php?action=rp&key=$key&login=" . rawurlencode( $user_login ), 'login' ); // 用Heredoc编写HTML邮件内容,直接插入动态变量 $message = <<<HTML <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>密码重置通知</title> </head> <body style="font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto; padding: 20px;"> <h2>重置你的账户密码</h2> <p>你提交了密码重置请求,请点击下方链接完成操作:</p> <p><a href="{$reset_link}" style="display: inline-block; padding: 10px 20px; background-color: #0073aa; color: #fff; text-decoration: none; border-radius: 4px;">立即重置密码</a></p> <p>若未发起此请求,请忽略本邮件即可。</p> </body> </html> HTML; // 邮件发送成功后,移除HTML内容类型过滤器,恢复默认设置 add_action( 'wp_mail_succeeded', function() { remove_filter( 'wp_mail_content_type', '__return_html_content_type' ); } ); return $message; }
关键说明
- 钩子参数修正:
add_filter的第四个参数设为4,确保函数能获取$key和$user_login动态参数,生成有效重置链接。 - Heredoc语法:用
<<<HTML和HTML;包裹内容,直接插入{$reset_link}变量,彻底避免引号转义导致的链接截断问题。 - 内容类型隔离:仅在重置邮件流程中启用HTML类型,不干扰其他系统邮件的格式。
内容的提问来源于stack exchange,提问作者blackfox
相关产品推荐
相关产品推荐

