Includerea unui fișier șablon HTML în wp_mail

18 apr. 2013, 22:38:54
Vizualizări: 33.9K
Voturi: 4

Folosesc wp_mail() pentru a trimite un email HTML. Dar există destul de mult cod HTML în email, așa că în loc să includ tot codul în funcția wp_mail(), este posibil să am codul într-un șablon separat și să includ doar acest șablon în funcție? Iată ce am:

<?php if ( isset( $_POST['submitted'] )) {
   add_filter('wp_mail_content_type',create_function('', 'return "text/html"; '));
   $emailTo = 'person@gmail.com' ;
   $subject = 'Acesta este subiectul';
   $body = get_template_part( 'includes/my_email_template' );
   $headers = 'From: Numele Meu' . "\r\n";
   wp_mail($emailTo, $subject, $body, $headers);
}?>

Aș dori să pot pune tot codul meu HTML în 'my_email_template' dar când încerc asta, nu se trimite niciun email. Includ șablonul incorect? Mulțumesc anticipat pentru orice răspunsuri.

5
Comentarii

Eroare de sintaxă: $emailTo = person@gmail.com ; încercați $emailTo = 'person@gmail.com';.

fuxia fuxia
18 apr. 2013 22:42:04

Apelezi template-ul incorect - vezi codex pentru get_template_part

vancoder vancoder
18 apr. 2013 22:44:56

Mulțumesc amândurora. Acea eroare de sintaxă a fost doar o copiere/lipește/adaptare neglijentă din partea mea. Pot confirma că în template-ul meu real este corect.

Xav Xav
18 apr. 2013 22:53:46

@vancoder Nici măcar nu sunt sigur că ar trebui să folosesc get_template_path. Fișierul conține doar HTML și câteva variabile pe care le-am setat în fișierul care îl apelează. Poate include (TEMPLATEPATH . 'includes/my_email_template.php'); este opțiunea corectă?

Xav Xav
18 apr. 2013 22:58:20

Fișierul tău de template returnează un string? Dacă doar îl incluzi, orice HTML sau echo se vor afișa direct pe ecran în loc să fie atribuite la $body. Presupun că asta va cauza și unele erori cu wp_mail.

s_ha_dum s_ha_dum
18 apr. 2013 23:29:55
Toate răspunsurile la întrebare 3
2
13

Iată codul exemplu pentru utilizarea buffer-ului de ieșire. Veți putea accesa toate variabilele din template care sunt definite înaintea liniei de "include".

WordPress: Include template în e-mail.

ob_start();
include(get_stylesheet_directory() . '/assets/email-templates/booking-details-template.php');
$email_content = ob_get_contents();
ob_end_clean();
$headers = array('Content-Type: text/html; charset=UTF-8');
wp_mail($to_email, "Detalii rezervare", $email_content, $headers);
6 nov. 2018 01:39:27
Comentarii

Aceasta este cea mai ușoară metodă de a personaliza wp_mail până acum

Kevin Mamaqi Kevin Mamaqi
8 dec. 2019 09:22:17

Am folosit și eu această soluție pentru a obține antetul și subsolul implicit al emailurilor Woocommerce în funcția mea personalizată de trimitere a emailurilor, înlocuind linia include cu un do_action pentru woocommerce_email_header. Mulțumesc!

Suika Suika
9 mar. 2020 03:33:35
0

Conform comentariului meu la întrebarea ta, cred că problema este că include fișiere, fie direct sau folosind get_template_part, nu este probabil să îți ofere un șir de caractere pentru a-l transmite la $body și asta va cauza erori în cod, sau cel puțin un comportament neașteptat.

Aș evita citirea fișierelor în memorie și aș crea o funcție care returnează conținutul pentru $body.

function get_email_body_wpse_96357() {
    $body = '<p>Salut</p>';
    return $body;
}

Apoi folosește $body = get_email_body_wpse_96357(); după necesitate. Un avantaj al acestei metode este că poți pasa cu ușurință parametri funcției dacă vei decide să faci asta. Ai putea folosi și variabile într-un fișier inclus, dar poate deveni complicat.

Dacă nu vrei să încarci acea funcție tot timpul, atunci pune-o într-un fișier separat și include acel fișier doar când ai nevoie de funcție.

19 apr. 2013 00:11:01
5

Funcția get_template_part() nu returnează HTML-ul ci îl afișează (folosește locate_template() care încarcă fișierul - echo).

Puteți fie să activați bufferizarea output-ului folosind ob_start() și să puneți buffer-ul în variabila dvs. sau puteți folosi file_get_contents().

În cazul dvs. cred că cea mai bună soluție este aceasta:

$body = file_get_contents(TEMPLATEPATH . 'includes/my_email_template.php');
18 apr. 2013 23:40:49
Comentarii

Mulțumesc pentru răspunsul tău ItayXD, dar acum am reușit să fac să funcționeze folosind răspunsul de mai sus

Xav Xav
19 apr. 2013 00:37:36

Am văzut, răspunsul de mai sus este mult inferior IMO. Funcția file_get_contents este exact ceea ce căutai și este mult mai ușor să scrii fișierul html în mod normal decât să folosești soluția de mai sus. De fapt, pur și simplu nu văd cum este mai bună, văd doar dezavantajele.

ItayXD ItayXD
19 apr. 2013 00:43:05

Această soluție este mai curată și mai ușoară. Mult mai MVC prin faptul că logica este în functions.php și template-ul în propriul fișier.

rebellion rebellion
24 aug. 2014 20:48:19

Cum să transmiți variabilele la șabloane?

mpsbhat mpsbhat
4 iun. 2016 04:29:01

Am văzut transmiterea variabilelor făcută folosind str_ireplace ca în str_ireplace('[username]',$user_login, $message_template); -- este aceasta ideală/cea mai bună practică? - Din acest link: http://www.avtex.com/blog/2012/03/14/creating-dynamic-html-e-mail-templates-in-wordpress/

ejntaylor ejntaylor
30 dec. 2016 21:50:55