在开发 wpsite 主题的时候,有一个需求,就是审核链接邮件通知功能,其实这个通知邮件并不需要实时发送,只需要先完成审核的逻辑,再发送邮件通知即可。这样的场景其实很多见,比如评论审核通过邮件通知,账号资料修改成功邮件通知,投稿文章审核邮件通知等等,凡是不需要实时通知的我们都可以采用本文分享的异步发送邮件的方法。
首先我们来认识一下 WordPress 可扩展函数(pluggable)的作用及用法,Wordpress 核心函数中有一些函数称为可扩展函数(pluggable functions),这些函数都是在 wp-include/pluggable.php 中被定义的,正如它们的名字一样,我们可以通过插件来重写或者加强它们的功能。
可扩展函数的真正强大之处在于我们可以自定义函数来增强或改变原有函数的行为。在 pluggable.php 中可以找到这些函数的定义,或者在 WP 文档 Pluggable Functions 中找到它们。以下有几个经常被重写的核心函数:
wp_logout 用于登出 WP 系统,你可以在这里加入一些自定义的操作(如移除自定义 SESSION 等)。
wp_mail 是被扩展的最多的 WP 函数,可以通过覆写它来使用自己的邮件模版、使用其它的发送邮件方式(如 SMTP)等。
wp_new_user_notification 可以修改新用户注册时发送邮件的方式。
auth_redirect 用于在用户未登录时重定向操作到登录页,可以用它来显示一些自定义的信息。
接着我们来熟悉下这个可扩展函数的加载顺序:
所以的自定义扩展函数都应该放在 pluggable.php 文件被加载之前定义,即在插件中定义;
如果插件中没有定义扩展函数,将会默认执行 pluggable.php 中定义的函数;
你无法在主题中定义扩展数,因为主题会在 pluggable.php 之后加载,此时这些可扩展函数都是已经被定义过的了。 所以我们只能够在插件中来重写这些函数(自己创建一个插件的方式非常简单)。接下来的问题就是如果多个插件中同时重写了同一个可扩展函数时将会怎样呢?这个时候就无法再像我们预期那样执行了,系统总会调用第一次被定义的那个函数。
回到本文的主题,要想实现 WordPress 异步发送邮件通知,我们需要在插件中重写 wp_mail 函数,然后调用 wordpress 的定时任务来实现