无法覆盖可插拔函数wp_mail

时间:2014-05-31 作者:Prahlad Yeri

几天前,我在openshift上的wordpress博客突然停止向我发送邮件和通知。到目前为止,我从未想过wordpress是如何处理邮件发送的,因为它们总是有效的。现在,在阅读了codex等之后,我知道wordpress通过调用wp\\u mail(),然后调用@mail()php函数来处理这个问题,该函数最终调用unix sendmail。由于我不想依赖sendmail/openshift,我决定重写wp\\u邮件pluggable 函数,以便它调用我自己的sendgrid函数,而不是使用核心函数。以下是我的插件代码:

<?php
/**
 * Plugin Name: Sendgrid Plugin
 * Plugin URI:  http://www.prahladyeri.com
 * Description: Mail sending using Sendgrid Web API
 * Version:     0.1
 * Author:      Prahlad Yeri
 * Author URI:  http://www.prahladyeri.com
 * Text Domain:
 * Domain Path:
 * Network:
 * License:     GPLv2
 */

namespace MailDemo;
require_once(\'sendgrid.php\');

add_action( \'init\', __NAMESPACE__ . \'\\plugin_init\' );

/**
 * Plugin Name: Prahlad\'s mail
 * Description: Alternative way to send a mail
 */
if (!function_exists(\'wp_mail\')) 
{
    file("http://".$_SERVER[\'SERVER_NAME\']."/logme.php?" . \'Iwill_Override\');   
    function wp_mail($to, $subject, $message, $headers = \'\', $attachments = array())
    {
        sendgridmail($to, $subject, $message, $headers);
    }
    file("http://".$_SERVER[\'SERVER_NAME\']."/logme.php?" . \'Iwas_Overridden\');  
}
else 
{
    file("http://".$_SERVER[\'SERVER_NAME\']."/logme.php?" . \'Iwas_Not_Overridden\');  
}

function plugin_init()
{
    file("http://".$_SERVER[\'SERVER_NAME\']."/logme.php?" . \'Maildemo_Plugin_Init\'); 
}

//echo __NAMESPACE__ . "\\n";
这里是include文件sendgrid。php(我在CLI上单独测试了它,效果很好):

<?php
function sendgridmail($to, $subject, $message, $headers)
{
$url = \'https://api.sendgrid.com/\';
$user=\'myapikey\';
$pass=\'myapipassword\';

$params = array(
    \'api_user\'  => $user,
    \'api_key\'   => $pass,
    \'to\'        => $to,
    \'subject\'   => $subject,
    \'html\'      => \'\',
    \'text\'      => $message,
    \'from\'      => \'[email protected]\',
  );


    $request =  $url.\'api/mail.send.json\';

    // Generate curl request
    $session = curl_init($request);
    // Tell curl to use HTTP POST
    curl_setopt ($session, CURLOPT_POST, true);
    // Tell curl that this is the body of the POST
    curl_setopt ($session, CURLOPT_POSTFIELDS, $params);
    // Tell curl not to return headers, but do return the response
    curl_setopt($session, CURLOPT_HEADER, false);
    curl_setopt($session, CURLOPT_RETURNTRANSFER, true);

    // obtain response
    $response = curl_exec($session);
    curl_close($session);
}

//only for testing:
/*$to      = \'[email protected]\';
$subject = \'Testemail\';
$message = \'It works!!\';
echo \'To is: \' + $to;
//wp_mail( $to, $subject, $message, array() );
sendgridmail($to, $subject, $message, $headers);
print_r(\'Just sent!\');*/
问题是,wordpress似乎并没有调用此功能。昨天我刚开始测试时,它确实工作了一两次,但之后就不再工作了。wordpress似乎仍在调用核心wp\\U邮件函数,而不是调用此函数。各位有什么想法吗?

1 个回复
最合适的回答,由SO网友:birgire 整理而成

我认为这句话:

namespace MailDemo;
是你遇到问题的原因。

您可以定义您的自定义wp_mail() 函数,因此看起来您正在尝试重写该函数:

\\MailDemo\\wp_mail() 
但不是可插拔功能:

\\wp_mail()
尝试删除名称空间设置,看看会发生什么。

另一种解决方法是从文件中包含覆盖代码部分,例如:

require_once plugin_dir_path( __FILE__ ) . \'override_wp_mail.php\';
将其纳入WordPress核心的全球范围。

结束

相关推荐

Custom Post Types in plugins?

我一直在想这个。在我现在看到的大多数插件中,它们看起来像CPT,但没有“已发布”链接。他们也不担任职务。它们只是停留在仪表板中的插件,页面和列列表顶部有“添加新”链接,当您单击“编辑”时,可以像在任何其他CPT中一样编辑项目。所以我想知道他们是否是CPT?如果是的话,有没有关于这方面的教程?我正在考虑为我的网站创建一个插件,我想要的是构建一个插件,我可以“添加新项目”,并保存项目(并且可以编辑)。我可以通过短代码调用项目。我知道如何在函数中创建CPT。php和我一直在阅读关于基本插件创建的内容。我似乎找不