Невозможно переопределить подключаемую функцию 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 вместо вызова этой. Есть идеи, ребята?
1 answers
Я думаю, что эта строка:
namespace MailDemo;
Является причиной ваших проблем.
Вы определяете свою пользовательскую функцию wp_mail()
в этом пространстве имен, поэтому похоже, что вы пытаетесь переопределить функцию:
\MailDemo\wp_mail()
Но не подключаемая функция:
\wp_mail()
Попробуйте удалить настройку пространства имен и посмотрите, что произойдет.
Другим способом обойти это было бы включить часть кода переопределения из файла, например:
require_once plugin_dir_path( __FILE__ ) . 'override_wp_mail.php';
Чтобы иметь его в глобальном масштабе для Ядро WordPress.