Includere un file template HTML in wp_mail
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.

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);

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

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.

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');

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

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.

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

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/
