web-dev-qa-db-ja.com

プラガブル関数wp_mailをオーバーライドできません

数日前、openshiftでホストされていた私のワードプレスのブログが突然私にメールや通知を送るのを止めました。今まで私は、Wordpressがメール送信をどのように処理していたかに煩わされていませんでした。今、コーデックスなどを通過した後、私はwordpressがwp_mail()を呼び出し、それから@mail()php関数を呼び出すことによってこれを処理することを知るようになりました。私は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!');*/

問題は、これがワードプレスによって呼び出されていないようです。昨日最初にテストしたときに1回か2回動作しましたが、その後は動作しなくなりました。 wordpressはまだこの関数を呼び出すのではなく、コアのwp_mail関数を呼び出しているようです。何かアイデアの人?

1
Prahlad Yeri

私はこの行を考える:

namespace MailDemo;

あなたの問題の理由です。

あなたはあなたのカスタムwp_mail()関数をこの名前空間の中で定義します。

\MailDemo\wp_mail() 

しかしプラガブル関数ではありません:

\wp_mail()

名前空間の設定を削除して何が起こるか見てみましょう。

これを回避するもう1つの方法は、ファイルからのオーバーライドコード部分を含めることです。次に例を示します。

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

wordPressコアのグローバルな範囲にそれを持っています。

1
birgire