Cum să folosești PHPmailer într-o funcție în WordPress
Am o funcție în fișierul functions.php din WordPress care caută o condiție în meta-datele utilizatorului și trimite un email unui utilizator în funcție de ce găsește. În prezent folosesc wp_mail() pentru a trimite emailul și funcționează. Cu toate acestea, vreau să folosesc clasa PHPMailer inclusă pentru a face acest lucru, astfel încât să pot trimite mesajele prin SMTP.
Am crezut că am găsit o soluție aici: https://codex.wordpress.org/Plugin_API/Action_Reference/phpmailer_init, totuși, aceasta pare să se aplice doar mesajelor generate de sistem, nu pentru mesajele personalizate.
În acest moment doar ghicesc, dar am încercat următorul cod, fără succes (WordPress se oprește din încărcare în acest punct, fără mesaj de eroare):
function my_function() {
//dacă se găsesc lucruri, trimite un 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 = 'Here is the subject';
$phpmailer->Body = 'This is the HTML message body <b>in bold!</b>';
$phpmailer->send();
// Email trimis; funcția s-a terminat
}
Pentru informare, apelez această funcție în header. Nu o adaug ca acțiune deoarece vreau să controlez unde este utilizată.
Există vreo modalitate de a accesa clasa PHPMailer direct din funcția mea? Presupun că aș putea încărca PHPMailer separat, dar pare inutil.
Nu este nevoie să folosești clasa PHPMailer în locul funcției wp_mail()
. wp_mail()
este practic un wrapper pentru această clasă. Pur și simplu oferă o metodă mai ușoară de a pacheta și trimite mesajul.
Poți accesa elementele PHPMailer când acesta este inițializat pentru a face ca wp_mail()
să trimită prin SMTP în loc de serverul web.
Ai menționat că nu adaugi o acțiune pentru a controla unde este folosit, dar tocmai pentru asta este un action hook - îți permite să te conectezi exact unde dorești, când dorești.
În acest caz, toate acele elemente PHPMailer trebuie setate când PHPMailer este inițializat. Există un action hook pentru asta - phpmailer_init
.
Poți defini setările tale când PHPMailer este inițializat folosind acest 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');
}
Dorești ca mesajul tău să fie în HTML. Ai putea seta asta în argumentul header al funcției wp_mail()
, dar ar fi mai bine să folosești filtrul wp_mail_content_type
pentru asta:
add_filter( 'wp_mail_content_type','set_my_mail_content_type' );
function set_my_mail_content_type() {
return "text/html";
}
Cu setările configurate corect, acum ești pregătit să folosești wp_mail()
pentru a trimite mesajul și poți face asta oriunde - recomand să conectezi această funcție la ceva care are sens - cum ar fi 'template_redirect' pentru a o executa înainte ca antetele să fie trimise:
function my_function() {
$to = 'joe@example.com';
$subject = 'Aici este subiectul';
$message = 'Acesta este corpul mesajului HTML <b>în bold!</b>';
wp_mail( $to, $subject, $message );
}
Actualizare: Metodă Alternativă (Conținută):
Extinzând ceea ce a fost descris mai sus, să presupunem că unele dintre aceste setări nu sunt ceea ce dorești în mod normal pentru fiecare apel al funcției wp_mail()
și că vrei aceste setări doar pentru un e-mail specific.
Tot ar trebui să separi setările și să le conectezi corespunzător (altfel nu vor fi procesate la momentul potrivit). Observând că hook-urile phpmailer_init
și wp_mail_content_type
sunt declanșate când funcția wp_mail()
este executată, ai putea seta aceste hook-uri în funcția ta principală, trimite e-mailul, apoi să le elimini pentru a reveni la setările implicite.
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 = 'Aici este subiectul';
$message = 'Acesta este corpul mesajului HTML <b>în bold!</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' );
}

Folosirea unui apel către un fișier de bază din WP nu este întotdeauna cea mai bună soluție. Funcționează acum, dar dacă ceva se schimbă într-o versiune viitoare? Este întotdeauna mai bine să folosești o acțiune de bază existentă, așa cum este documentat corect, pentru a menține compatibilitatea în actualizările viitoare.
