web-dev-qa-db-fra.com

Impossible de remplacer la fonction enfichable wp_mail

Il y a quelques jours, mon blog wordpress hébergé sur openshift a soudainement cessé de m'envoyer des mails et des notifications. Jusqu'à présent, je n'avais jamais pensé à la façon dont WordPress gérait l'envoi de courrier, car ils fonctionnaient toujours. Maintenant, après être passé par codex, etc., je me suis rendu compte que wordpress gérait cela en appelant la fonction wp_mail (), puis @mail () php qui appelle finalement le sendmail unix. Puisque je ne veux pas dépendre de sendmail/openshift, j’ai décidé de remplacer la fonction plug-in wp_mail de mon plugin personnalisé, de sorte fonction sendgrid au lieu d’utiliser celle de base. Voici mon code pour le plugin:

<?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";

Et voici le fichier include sendgrid.php (je l'ai testé individuellement sur la CLI et cela fonctionne bien):

<?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!');*/

Le problème, c'est que cela ne semble pas être appelé par wordpress. Cela a fonctionné une ou deux fois lorsque je l’ai testé pour la première fois hier, mais après cela, il ne fonctionne plus. On dirait que wordpress appelle toujours la fonction de base wp_mail au lieu d'appeler celle-ci. Des idées, les gars?

1
Prahlad Yeri

Je pense que cette ligne:

namespace MailDemo;

est la raison de vos problèmes.

Vous définissez votre fonction wp_mail() personnalisée dans cet espace de noms. Il semble donc que vous essayez de remplacer la fonction:

\MailDemo\wp_mail() 

mais pas la fonction enfichable:

\wp_mail()

Essayez de supprimer la configuration de l'espace de noms et voyez ce qui se passe.

Une autre solution consiste à inclure la partie de code de substitution d'un fichier, par exemple:

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

l'avoir dans la portée globale du noyau WordPress.

1
birgire