Există o modalitate de a trimite e-mailuri formatate HTML cu funcția wp_mail() din WordPress?

7 sept. 2011, 00:08:38
Vizualizări: 152K
Voturi: 74

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?

1
Comentarii

Verifică acest articol uimitor despre wp_mail() https://www.phparticles.com/wordpress/how-to-use-wp-mail-with-wordpress/

Mr.Happy Mr.Happy
4 oct. 2020 15:34:56
Toate răspunsurile la întrebare 5
6
175

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 );
26 iul. 2015 18:01:32
Comentarii

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

deepakssn deepakssn
17 feb. 2018 20:54:57

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.

Alex Standiford Alex Standiford
6 dec. 2019 21:12:35

Acesta ar trebui să fie răspunsul acceptat

CaptainNemo CaptainNemo
27 sept. 2020 21:49:20

Acest răspuns ar trebui să fie cel acceptat!

Fernando Torres Fernando Torres
30 iun. 2021 23:46:10

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.

Rick Hellewell Rick Hellewell
6 aug. 2022 01:37:14

Această soluție este mult superioară, deoarece cu tehnica add_filter() este prea ușor să uiți să apelezi remove_filter('wp_mail_content_type'); și să lași lucrurile într-o mizerie pentru alte plugin-uri.

Brian C Brian C
8 oct. 2023 15:04:17
Arată celelalte 1 comentarii
12
79

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.

7 sept. 2011 00:23:34
Comentarii

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

racl101 racl101
7 sept. 2011 00:31:04

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.

Milo Milo
7 sept. 2011 00:45:32

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

Otto Otto
7 sept. 2011 03:29:46

oh da, ha ha. Ce n00b sunt. Cred că este ID-ul acestui post.

racl101 racl101
7 sept. 2011 10:44:03

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 AlxVallejo
28 iul. 2012 02:21:08

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

Blowsie Blowsie
28 ian. 2013 14:48:30

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

Jeremy Jeremy
2 nov. 2016 01:05:40

@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 Milo
2 nov. 2016 05:20:54

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

Jeremy Jeremy
2 nov. 2016 23:12:13

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

Simon Josef Kok Simon Josef Kok
24 oct. 2017 09:08:04

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

Flimm Flimm
4 apr. 2019 15:31:42

@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

Mark Berry Mark Berry
11 feb. 2020 03:22:47
Arată celelalte 7 comentarii
1
14

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

2 ian. 2015 16:25:25
Comentarii

Aceasta ar trebui să fie un comentariu, nu un răspuns, nu?

Bob Diego Bob Diego
26 iul. 2017 17:31:07
0

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

5 apr. 2020 08:39:47
0

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.

5 mar. 2020 05:28:13