我认为这里有两个不错的选择。
让WordPress保留它的邮件功能,但一次或两次钩住wp\\u mail()有几个钩子,可以帮助您替换内置行为,基本上就是使用php的简单小邮件程序。
以下是我认为您可能会使用的一些有用的挂钩,因为这正是您所要求的:
//Filter the message (recipient, subject, body, etc.)
add_filter( \'wp_mail\', \'your_filter_function\', 11, 1);
function your_filter_function( $args ){
//$args is an array of \'to\', \'subject\', \'message\', \'headers\', and \'attachments\'
//do whatever you want to the message
}
更重要的是,要取代WordPress对phpmailer的使用:
//Runs after phpmailer is initialized, and passes the phpmailer instance by reference
add_action( \'phpmailer_init\', \'your_mailer_function\', 99, 1 );
function your_mailer_function( &$phpmailer ){
//$phpmailer is a direct reference to the phpmailer instance WordPress started
//set it to something else, i.e. an SMTP mailer object, to override
//you may also want to configure the "from" email at this point to match the
//SMTP account you\'re using
}
重要的部分是使用上面的第二个钩子,我们实际上通过引用(即通过内存地址)获得phpmailer实例,因此我们可以直接修改它。钩子运行后,WordPress的下一个代码是:
return $phpmailer->send();
因此,如果此时您替换了$phpmailer,它将调用对象的send方法。
选项2-替换WordPress的邮件功能wp\\U mail是WordPress的可插入功能之一,这意味着您可以完全重新定义它。
原始函数定义如下所示:
function wp_mail( $to, $subject, $message, $headers = \'\', $attachments = array() ) {
因此,如果您重新定义它并保留相同的参数,那么将调用您的函数。
由于WordPress只允许对每个可插入函数(通过includes/pluggable.php中的方式找到)定义一次,因此您应该将替换函数包装在if(!function\\u exists(…调用)中。
我的建议是,WordPress整体上似乎正在从可插拔功能(方法2)转向hooks方法,这对我来说更有意义,因为你只需要更换必要的部分,而保留所有其他部分,此外,您还可以在挂钩上指定优先级,以便在一位以上的代码修改默认行为时有更多的控制权。所以我建议使用方法1。
注意:
仅仅是一个教学时刻,10分钟前我还不知道这些挂钩。我打开了一个新的WordPress文件夹并搜索了;功能wp\\U mail;找到主代码,然后查看其中的挂钩。在找到我认为合适的钩子之后,我还下载了一个WordPress SMTP插件,并查看了代码,看看它们使用了哪些钩子。我看到的一个(Easy WP SMTP)使用了相同的2,再加上一些其他的用于一些更高级的功能。我还注意到,该函数是在pluggable中定义的。php,在这里可以直接重写live函数。
所以您可能已经这样做了,但不要害怕跳入WordPress核心代码并四处挖掘。