Există o modalitate de a trimite e-mailuri formatate HTML cu funcția wp_mail() din WordPress?
Există vreun action_hook sau ceva similar care m-ar putea ajuta să realizez acest lucru?
Am încercat să adaug marcaj într-o variabilă string PHP și am trimis un e-mail cu funcția wp_mail()
astfel:
$email_to = 'someaddress@gmail.com';
$email_subject = 'Email subject';
$email_body = "<html><body><h1>Hello World!</h1></body></html>";
$send_mail = wp_mail($email_to, $email_subject, $email_body);
Dar a apărut ca text simplu?
Aveți vreo idee?

Ca alternativă, puteți specifica antetul HTTP Content-Type în parametrul $headers:
$to = 'sendto@example.com';
$subject = 'Subiectul';
$body = 'Conținutul corpului email-ului';
$headers = array('Content-Type: text/html; charset=UTF-8');
wp_mail( $to, $subject, $body, $headers );

Această soluție funcționează mai bine, deoarece add_filter uneori apare ca atașament. Mulțumesc pentru partajare!

Aceasta este în general cea mai bună metodă de a face acest lucru. Răspunsul de top va interfera cu alte plugin-uri și va cauza probleme.

Din citirea codului sursă al wp_mail(), se pare că anteturile nu pot fi un array, ci trebuie să fie în formatul 'to: joe@domain.com'. Încă încerc să testez acest lucru și voi accepta părerea dezvoltatorilor cu mai multă experiență pentru a verifica acuratețea mea.

de la pagina Codex wp_mail:
Tipul implicit de conținut este 'text/plain' care nu permite utilizarea HTML. Totuși, puteți seta tipul de conținut al email-ului folosind filtrul 'wp_mail_content_type'.
// În functions.php al temei sau în codul unui plugin:
function wpse27856_set_content_type(){
return "text/html";
}
add_filter( 'wp_mail_content_type','wpse27856_set_content_type' );
Acum, de fiecare dată când este apelată funcția wp_mail
, fie în codul tău, în codul WordPress, în codul unui plugin sau în codul unei teme, tipul MIME va fi setat la text/html
. Dacă există orice apeluri ale funcției wp_mail
care trimit text simplu, acele apeluri nu vor mai funcționa. Așadar, fiți atenți.

Hmm sună util. Doar o întrebare, vreun motiv anume pentru care ai numit funcția ta wpse27856_set_content_type?

Nu, e doar un nume unic bazat pe id-ul acestei întrebări specifice. wpse = wp stachexchange, 27856 este id-ul acestei întrebări din URL. Fac asta doar pentru a evita potențiale coliziuni dacă oamenii copiază/lipește codul de aici.

Poți de asemenea să incluzi Content-Type direct în anteturile emailului. Verifică cum face plugin-ul Notifly asta.

Ar trebui ca email-ul să fie un fișier .txt sau .html? Folosesc această metodă, dar dacă vizualizez sursa, este un fișier .txt și imaginea încorporată nu este procesată.

@AlxVallejo dacă trimiți dintr-un fișier, probabil va trebui mai întâi să citești fișierul ca șir de caractere.

transmiterea antetelor este o metodă mai eficientă decât adăugarea unui hook. -1

@Jeremy desigur, dar transmiterea directă a antetelor nu este o opțiune în multe cazuri, cum ar fi atunci când nu este codul tău care apelează wp_mail
.

@Milo Ai dreptate, dar pentru această întrebare anteturile sunt răspunsul corect.

Acest lucru va afecta emailul de resetare a parolei, deoarece linkul de resetare este încadrat între <>.

Nu afectează acest lucru alte coduri care se așteaptă ca wp_mail
să trimită emailuri în text simplu, în loc de emailuri HTML?

@SimonJosefKok, dacă înțeleg corect acest raport de eroare, problema care afectează emailurile de resetare a parolei a fost rezolvată începând cu WordPress 5.4. Se pare că au decis să elimine parantezele unghiulare din adresa de email. https://core.trac.wordpress.org/ticket/23578#comment:24

Nu uitați să eliminați filtrul de tip de conținut după ce folosiți funcția wp_mail. Conform răspunsului acceptat, ar trebui să faceți acest lucru după ce wp_mail este executat:
remove_filter( 'wp_mail_content_type','wpse27856_set_content_type' );
Consultați acest tichet aici - Resetare content-type pentru a evita conflictele -- http://core.trac.wordpress.org/ticket/23578

O altă metodă simplă pe care o voi împărtăși mai jos. Poți chiar să stilizezi corpul email-ului după cum dorești. Poate îți va fi de folos.
$email_to = 'someaddress@gmail.com';
$email_subject = 'Subiectul email-ului';
// <<<EOD este sintaxa heredoc în PHP
$email_body = <<<EOD
Acesta este noul tău <b style="color: red; font-style: italic;">parolă</b> : {$password}
EOD;
$headers = ['Content-Type: text/html; charset=UTF-8'];
$send_mail = wp_mail( $email_to, $email_subject, $email_body, $headers );
Mai multe despre sintaxa heredoc în PHP https://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc

Folosește ob_start
, deoarece aceasta va permite utilizarea variabilelor/funcțiilor WP precum bloginfo etc.
Creează un fișier PHP și lipește codul HTML în acel fișier (folosește variabile WordPress în interiorul fișierului PHP dacă este necesar).
Folosește codul de mai jos:
$to = 'Adresa de email';
$subject = 'Subiectul tău';
ob_start();
include(get_stylesheet_directory() . '/email-template.php'); //Calea către fișierul șablon
$body = ob_get_contents();
ob_end_clean();
$headers = array('Content-Type: text/html; charset=UTF-8','From: Test <test@test.com>');
wp_mail( $to, $subject, $body, $headers );
Aceasta va menține codul curat și datorită ob_start vom economisi timpul de încărcare a fișierului.
