共计 131 个字符,预计需要花费 1 分钟才能阅读完成。
今天收到两条评论,发现没有收到邮件通知,转念一想自己也没设置过邮件相关的配置,查了一下文档发现 wordpress 是通过 wp_mail 函数发送邮件的。
源码分析
打开 wordpress 源码文件 wp-includespluggable.php
,定位到 wp_mail 函数:
看到了熟悉的 PHPMainler。https://github.com/PHPMailer/PHPMailer ,继续往下:
isMail();->isMail();
通过 IDE 追溯一下 isMail,PHPMailer 类如下:
Mailer = 'smtp';
}
/**
* Send messages using PHP's mail() function.
*/
public function isMail()
{$this->Mailer = 'mail';
}
由此可知 worpdress 使用的是 php 自带的 mail 函数,继续拓展一下:
1.PHP Mail 简介
- mail() 函数允许您从脚本中直接发送电子邮件。
- 要使邮件函数可用,PHP 需要已安装且正在运行的邮件系统。要使用的程序是由 php.ini 文件中的配置设置定义的。
- Mail 函数是 PHP 核心的组成部分。无需安装即可使用这些函数。
- Mail 函数的行为受 php.ini 文件中的设置的影响。
我的 PHP 压根就没配置过这些玩意,理所当然,邮件发不出,但是讲道理,为什么不提供一个错误日志或者干脆抛致命错误🤦♂️。
继续往下看代码:
ContentType = $content_type;
默认邮件内容类型为普通文本,先记录一下,继续往下:
getMessage(), $mail_data) );
阅读完毕,梳理一下中间过程的钩子。
用到的 Hook
1.wp_mail
官方文档:https://developer.wordpress.org/reference/hooks/wp_mail/
wp_mail,用于过滤 wp_mail() 使用到的参数,参数列表:
- 'to',收件人
- 'subject',邮件主题
- 'message',邮件内容
- 'headers',邮件请求头?
- 'attachments',附件
add_filter 时参数为上方数组,过滤后返回同样的数组即可。
2.pre_wp_mail
官方文档:https://developer.wordpress.org/reference/hooks/pre_wp_mail/
简单的说,得到上面使用的参数,判断是否需要中断发送,返回 false,会直接中断邮件发送。
3.wp_mail_from、wp_mail_from_name
官方文档:https://developer.wordpress.org/?s=wp_mail_from
修改发信地址和发信人。
4.wp_mail_failed
官方文档:https://developer.wordpress.org/reference/hooks/wp_mail_failed/
这是一个 action 钩子,发送失败时触发这个钩子上的函数。
5.phpmailer_init
官方文档:https://developer.wordpress.org/reference/hooks/phpmailer_init/
这是一个 action,参数是 phpmailer 的引用地址,可以在这个钩子进行完全的自定义操作。
新发现
do_action_ref_array 和 do_action 的区别,应该在于一个是引用传递参数一个是按值传递
6.wp_mail_succeeded
这就就不细说了,发送成功时触发的钩子。
实现功能
1. 准备
准备着手改造,计划打算最终的成品应该如下:
- 收到评论通知我(站长)。
- 默认评论需要审核,审核通过通知发表评论的大哥。
- 回复评论时,通知被回复的大哥。
全局查找 wp_mail(),被调用过的地方。
太多了,找点有用的吧 ..............😂😂😂😂🤣
2. 分析
开启评论审核之后,有新的评论时 wordpress 会自动给站长邮箱发送邮件,我们需要做的就是在评论被回复时通知评论对象,以及审核通过时通知评论对象。(主动调用 wp_mail),邮件模板就不写了,直接借鉴一个开源的。https://github.com/seatonjiang/kratos
评论审核通过时,通知评论者,和被回复者。剩下的就是把逻辑糅合到主题里了。