Невозможно переопределить подключаемую функцию wp mail


Пару дней назад мой блог wordpress, размещенный на openshift, внезапно перестал отправлять мне письма и уведомления. До сих пор я никогда не беспокоился о том, как wordpress обрабатывает отправку почты, так как они всегда работали. Теперь, пройдя через codex и т. Д., Я узнал, что wordpress обрабатывает это, вызывая функцию wp_mail(), затем функцию php @mail(), которая в конечном итоге вызывает unix sendmail. Поскольку я не хочу зависеть от sendmail/openshift, я решил переопределить wp_mail подключаемая функция в моем пользовательском плагине, так что она вызывает мою собственную функцию 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";

А вот включаемый файл 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_mail вместо вызова этой. Есть идеи, ребята?

Author: Community, 2014-05-31

1 answers

Я думаю, что эта строка:

namespace MailDemo;

Является причиной ваших проблем.

Вы определяете свою пользовательскую функцию wp_mail() в этом пространстве имен, поэтому похоже, что вы пытаетесь переопределить функцию:

\MailDemo\wp_mail() 

Но не подключаемая функция:

\wp_mail()

Попробуйте удалить настройку пространства имен и посмотрите, что произойдет.

Другим способом обойти это было бы включить часть кода переопределения из файла, например:

require_once plugin_dir_path( __FILE__ ) . 'override_wp_mail.php';

Чтобы иметь его в глобальном масштабе для Ядро WordPress.

 1
Author: birgire, 2014-05-31 07:46:12