Come inviare email HTML formattate con la funzione wp_mail() di WordPress?
Esiste un action_hook o qualcosa di simile che potrebbe aiutarmi a ottenere questo risultato?
Ho provato ad aggiungere il markup in una variabile stringa PHP e ho semplicemente inviato un'email con la funzione wp_mail()
in questo modo:
$email_to = 'someaddress@gmail.com';
$email_subject = 'Oggetto email';
$email_body = "<html><body><h1>Ciao Mondo!</h1></body></html>";
$send_mail = wp_mail($email_to, $email_subject, $email_body);
Ma è apparsa come testo semplice?
Qualche idea?

In alternativa, puoi specificare l'header HTTP Content-Type nel parametro $headers:
$to = 'sendto@example.com';
$subject = 'Oggetto della mail';
$body = 'Contenuto del corpo della mail';
$headers = array('Content-Type: text/html; charset=UTF-8');
wp_mail( $to, $subject, $body, $headers );

Questa soluzione funziona meglio perché add_filter a volte viene mostrato come allegato. Grazie per averlo condiviso!

Questo è generalmente il modo migliore per farlo. La risposta in cima interferirà con altri plugin e causerà problemi.

Dalla mia lettura del codice sorgente di wp_mail(), sembra che gli header non possano essere un array, ma devono essere nel formato 'to: joe@domain.com'. Sto ancora cercando di testarlo, e lascio a sviluppatori più esperti il compito di verificare la mia affermazione.

dalla pagina codex di wp_mail:
Il tipo di contenuto predefinito è 'text/plain' che non consente l'uso di HTML. Tuttavia, puoi impostare il tipo di contenuto dell'email utilizzando il filtro 'wp_mail_content_type'.
// Nel file functions.php del tema o nel codice di un plugin:
function wpse27856_set_content_type(){
return "text/html";
}
add_filter( 'wp_mail_content_type','wpse27856_set_content_type' );
Ora, ogni volta che viene chiamata la funzione wp_mail
, sia che sia nel tuo codice, nel codice di WordPress, nel codice di un plugin o nel codice di un tema, il tipo MIME verrà impostato su text/html
. Se ci sono delle chiamate a wp_mail
che inviano testo semplice, quelle chiamate ora non funzioneranno più. Quindi fai attenzione.

Sembra utile. Solo una domanda, c'è una ragione specifica per cui hai chiamato la tua funzione wpse27856_set_content_type?

No, è solo un nome univoco basato sull'id di questa particolare domanda. wpse = wp stackexchange, 27856 è l'id di questa domanda nell'URL. Faccio così per evitare potenziali conflitti se le persone copiano/incollano il codice da qui.

Puoi anche includere direttamente il Content-Type negli header delle tue email. Dai un'occhiata a come lo fa il plugin Notifly.

L'email dovrebbe essere un file .txt o un file .html? Sto usando questo metodo ma se visualizzo il sorgente è un file .txt e l'immagine incorporata non viene processata.

@AlxVallejo se stai inviando da file probabilmente dovrai prima leggere il file come stringa.

passare gli header è un metodo più efficiente rispetto all'aggiunta di un hook. -1

@Jeremy certo, ma passare gli header direttamente non è un'opzione in molti casi, come quando non è il tuo codice a chiamare wp_mail
.

@Milo Hai ragione ma per questa domanda gli header sono la risposta corretta.

Questo interromperà l'email di reimpostazione della password, perché il link di reimpostazione è racchiuso tra <>.

Questo non interrompe altro codice che si aspetta che wp_mail
invii email in testo semplice, invece che in HTML?

@SimonJosefKok, se ho letto correttamente questo report di bug, il problema dell'interruzione delle email di reimpostazione password è stato risolto a partire da WordPress 5.4. Sembra che abbiano deciso di rimuovere le parentesi angolari dall'indirizzo email. https://core.trac.wordpress.org/ticket/23578#comment:24

Non dimenticare di rimuovere il filtro sul tipo di contenuto dopo aver utilizzato la funzione wp_mail. Come suggerito dalla risposta accettata, dovresti farlo dopo l'esecuzione di wp_mail:
remove_filter( 'wp_mail_content_type','wpse27856_set_content_type' );
Consulta questo ticket - Reimposta il content-type per evitare conflitti -- http://core.trac.wordpress.org/ticket/23578

Un altro metodo semplice che condividerò di seguito. Puoi anche personalizzare il corpo della mail come preferisci. Forse ti sarà utile.
$email_to = 'someaddress@gmail.com';
$email_subject = 'Oggetto della email';
// <<<EOD è la sintassi heredoc di PHP
$email_body = <<<EOD
Questa è la tua nuova <b style="color: red; font-style: italic;">password</b> : {$password}
EOD;
$headers = ['Content-Type: text/html; charset=UTF-8'];
$send_mail = wp_mail( $email_to, $email_subject, $email_body, $headers );
Per saperne di più sulla sintassi heredoc di PHP https://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc

Utilizza ob_start
, perché questo ti permetterà di usare variabili/funzioni di WP come bloginfo ecc.
Crea un file PHP e incolla il tuo HTML in quel file (usa le variabili di WP all'interno di quel file PHP se necessario).
Usa il seguente codice:
$to = 'Indirizzo Email';
$subject = 'Il tuo oggetto';
ob_start();
include(get_stylesheet_directory() . '/email-template.php');//Percorso del file template
$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 );
questo manterrà il tuo codice pulito e grazie a ob_start risparmieremo anche il tempo di caricamento del file.
