Come utilizzare PHPmailer in una funzione in WordPress
Ho una funzione nel file functions.php di WordPress che cerca una condizione nei meta utente e invia un'email all'utente in base a ciò che trova. Attualmente uso wp_mail() per inviare l'email, e funziona. Tuttavia, voglio utilizzare la classe PHPMailer inclusa per farlo in modo da poter inviare i messaggi tramite SMTP.
Pensavo di aver trovato una soluzione qui: https://codex.wordpress.org/Plugin_API/Action_Reference/phpmailer_init, tuttavia, questo sembra applicarsi solo ai messaggi generati dal sistema, non per i messaggi personalizzati.
A questo punto sto solo provando a indovinare, ma ho provato questo, senza successo (WP smette di caricare proprio a questo punto, senza messaggi di errore):
function my_function() {
// se vengono trovati elementi invia una email
global $phpmailer;
$phpmailer->IsSMTP();
$phpmailer->Host = 'smtp.google.com';
$phpmailer->Port = '587';
$phpmailer->SMTPSecure = 'tls';
$phpmailer->SMTPAuth = true;
$phpmailer->Username = 'something@gmail.com';
$phpmailer->Password = '11111111';
$phpmailer->addAddress('joe@example.com', 'Joe User');
$phpmailer->setFrom('from@example.com', 'Mailer');
$phpmailer->addReplyTo('info@example.com', 'Information');
$phpmailer->isHTML(true);
$phpmailer->Subject = 'Questo è l\'oggetto';
$phpmailer->Body = 'Questo è il corpo del messaggio HTML <b>in grassetto!</b>';
$phpmailer->send();
// Email inviata; funzione terminata
}
Per vostra informazione, richiamo questa funzione nell'header. Non la sto aggiungendo come azione perché voglio controllare dove viene utilizzata.
C'è un modo per accedere direttamente alla classe PHPMailer dalla mia funzione? Suppongo che potrei caricare PHPMailer separatamente, ma sembra insensato.
Non è necessario utilizzare la classe PHPMailer al posto di wp_mail()
. wp_mail()
è essenzialmente un wrapper per la classe. Semplicemente offre un modo più semplice per impacchettare e inviare il messaggio.
Puoi accedere agli elementi di PHPMailer quando viene inizializzato per far sì che wp_mail()
invii tramite SMTP invece che tramite il server web.
Hai detto che non stai aggiungendo un'azione per controllare dove viene utilizzato, ma è proprio questo lo scopo di un action hook - ti permette di agganciarti esattamente dove vuoi, quando vuoi.
In questo caso, tutti quegli elementi di PHPMailer devono essere impostati quando PHPMailer viene inizializzato. C'è un action hook per questo - phpmailer_init
Puoi definire le tue impostazioni quando PHPMailer viene inizializzato utilizzando quell'hook:
add_action( 'phpmailer_init', 'send_smtp_email' );
function send_smtp_email( $phpmailer ) {
$phpmailer->isSMTP();
$phpmailer->Host = 'smtp.google.com';
$phpmailer->Port = '587';
$phpmailer->SMTPSecure = 'tls';
$phpmailer->SMTPAuth = true;
$phpmailer->Username = 'something@gmail.com';
$phpmailer->Password = '11111111';
$phpmailer->From = 'from@example.com';
$phpmailer->FromName = 'From Name';
$phpmailer->addReplyTo('info@example.com', 'Information');
}
Vuoi che il tuo messaggio sia in HTML. Potresti impostarlo nell'argomento header di wp_mail()
, ma puoi/dovresti usare il filtro wp_mail_content_type
per questo;
add_filter( 'wp_mail_content_type','set_my_mail_content_type' );
function set_my_mail_content_type() {
return "text/html";
}
Con la tua configurazione correttamente impostata, ora sei pronto per usare wp_mail()
per inviare il tuo messaggio e puoi farlo ovunque - consiglio di agganciare questa funzione a qualcosa che abbia senso - come 'template_redirect' così lo fai prima che gli header vengano inviati:
function my_function() {
$to = 'joe@example.com';
$subject = 'Ecco l\'oggetto';
$message = 'Questo è il corpo del messaggio HTML <b>in grassetto!</b>';
wp_mail( $to, $subject, $message );
}
Aggiornamento: Metodo Alternativo (Contenuto):
Quindi, estendendo quanto delineato sopra, supponiamo che alcune di queste impostazioni non siano quelle che vuoi normalmente per ogni invio di wp_mail()
e che tu voglia queste impostazioni solo per un'email specifica.
Dovresti comunque separare le impostazioni e agganciarle appropriatamente (altrimenti non verranno processate al momento giusto). Notando che gli hook phpmailer_init
e wp_mail_content_type
vengono attivati quando wp_mail()
viene eseguito, potresti impostare questi hook all'interno della tua funzione principale, inviare la tua email, poi rimuoverli per tornare alle impostazioni predefinite.
function send_smtp_email( $phpmailer ) {
$phpmailer->isSMTP();
$phpmailer->Host = 'smtp.google.com';
$phpmailer->Port = '587';
$phpmailer->SMTPSecure = 'tls';
$phpmailer->SMTPAuth = true;
$phpmailer->Username = 'something@gmail.com';
$phpmailer->Password = '11111111';
$phpmailer->From = 'from@example.com';
$phpmailer->FromName = 'From Name';
$phpmailer->addReplyTo('info@example.com', 'Information');
}
function set_my_mail_content_type() {
return "text/html";
}
function my_function() {
$to = 'joe@example.com';
$subject = 'Ecco l\'oggetto';
$message = 'Questo è il corpo del messaggio HTML <b>in grassetto!</b>';
add_filter( 'wp_mail_content_type','set_my_mail_content_type' );
add_action( 'phpmailer_init', 'send_smtp_email' );
wp_mail( $to, $subject, $message );
remove_filter( 'wp_mail_content_type','set_my_mail_content_type' )
remove_action( 'phpmailer_init', 'send_smtp_email' );
}

Utilizzare una chiamata a un file core di WP non è sempre la soluzione migliore. Funziona ora, ma cosa succede se qualcosa cambia in una versione futura? È sempre meglio utilizzare un'azione core esistente come documentato correttamente, in modo da mantenere la compatibilità con gli aggiornamenti futuri.
