Includere un file template HTML in wp_mail

18 apr 2013, 22:38:54
Visualizzazioni: 33.9K
Voti: 4

Sto usando wp_mail() per inviare un'email HTML. Ma c'è molto codice HTML nell'email, quindi invece di includere tutto il codice nella funzione wp_mail(), è possibile avere il codice in un template separato e includere questo template nella funzione? Ecco cosa ho:

<?php if ( isset( $_POST['submitted'] )) {
   add_filter('wp_mail_content_type',create_function('', 'return "text/html"; '));
   $emailTo = 'person@gmail.com' ;
   $subject = 'Questo è l\'oggetto';
   $body = get_template_part( 'includes/my_email_template' );
   $headers = 'From: Il Mio Nome' . "\r\n";
   wp_mail($emailTo, $subject, $body, $headers);
}?>

Vorrei poter mettere tutto il mio codice HTML in 'my_email_template' ma quando provo questo approccio, nessuna email viene inviata. Sto includendo il template in modo errato? Grazie in anticipo per le risposte.

5
Commenti

Errore di sintassi: $emailTo = person@gmail.com ; prova $emailTo = 'person@gmail.com';.

fuxia fuxia
18 apr 2013 22:42:04

Stai chiamando il template in modo errato - vedi il codex per get_template_part

vancoder vancoder
18 apr 2013 22:44:56

Grazie a entrambi. Quell'errore di sintassi era solo un mio errore di copia/incolla/modifica. Posso confermare che è corretto nel mio template effettivo.

Xav Xav
18 apr 2013 22:53:46

@vancoder Non sono nemmeno sicuro che dovrei usare get_template_path. Il file contiene solo HTML e alcune variabili che ho impostato nel file che lo richiama. Forse include (TEMPLATEPATH . 'includes/my_email_template.php'); è l'opzione corretta?

Xav Xav
18 apr 2013 22:58:20

Il tuo file template restituisce una stringa? Se lo includi semplicemente, qualsiasi HTML o echo verrà stampato direttamente sullo schermo invece di essere assegnato a $body. Immagino che causerà anche alcuni errori con wp_mail.

s_ha_dum s_ha_dum
18 apr 2013 23:29:55
Tutte le risposte alla domanda 3
2
13

Ecco il codice di esempio per utilizzare l'output buffering. Sarai in grado di accedere a tutte le variabili all'interno del template che sono definite sopra la "riga di include".

WordPress: Includi template nell'email.

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, "Dettagli della prenotazione", $email_content, $headers);
6 nov 2018 01:39:27
Commenti

Questo è di gran lunga il modo più semplice per personalizzare wp_mail

Kevin Mamaqi Kevin Mamaqi
8 dic 2019 09:22:17

L'ho usato anche io per ottenere l'intestazione e il piè di pagina predefiniti delle email di Woocommerce nella mia funzione personalizzata di invio email, sostituendo la riga include con un'azione do_action di woocommerce_email_header. Grazie!

Suika Suika
9 mar 2020 03:33:35
0

Come ho menzionato nel mio commento alla tua domanda, credo che il problema sia che l'uso di include per i file, sia direttamente che con get_template_part, difficilmente ti restituirà una stringa da passare a $body, causando errori nel codice o, come minimo, comportamenti inaspettati.

Eviterei di leggere file in memoria e creerei invece una funzione che restituisca il contenuto per $body.

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

Poi puoi usare $body = get_email_body_wpse_96357(); quando necessario. Un vantaggio di questo metodo è che puoi facilmente passare parametri alla funzione se mai decidessi di farlo. Potresti anche usare variabili in un file incluso, ma potrebbe risultare disordinato.

Se non vuoi caricare questa funzione ogni volta, mettila in un file separato e includi quel file solo quando ti serve la funzione.

19 apr 2013 00:11:01
5

La funzione get_template_part() non restituisce l'HTML ma lo visualizza direttamente (utilizza locate_template() che carica il file - echo).

Puoi attivare il buffering dell'output usando ob_start() e inserire il buffer nella tua variabile oppure puoi usare file_get_contents().

Nel tuo caso penso che la soluzione migliore sia questa:

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

Grazie per la tua risposta ItayXD ma ora ho risolto utilizzando la risposta sopra

Xav Xav
19 apr 2013 00:37:36

Ho visto, la risposta sopra è molto inferiore secondo me. file_get_contents è esattamente quello che cercavi, ed è molto più semplice scrivere il file html normalmente rispetto a usare la soluzione sopra. In effetti non riesco proprio a capire in che modo sia migliore, vedo solo aspetti negativi.

ItayXD ItayXD
19 apr 2013 00:43:05

Questa soluzione è più pulita e semplice. Molto più MVC avendo la logica in functions.php e il template nel suo file separato.

rebellion rebellion
24 ago 2014 20:48:19

Come passare le variabili ai template?

mpsbhat mpsbhat
4 giu 2016 04:29:01

Ho visto che si passano le variabili usando str_ireplace come in str_ireplace('[username]',$user_login, $message_template); -- è questa la soluzione ideale/la best practice? - Da questo link: http://www.avtex.com/blog/2012/03/14/creating-dynamic-html-e-mail-templates-in-wordpress/

ejntaylor ejntaylor
30 dic 2016 21:50:55