Come inviare email HTML formattate con la funzione wp_mail() di WordPress?

7 set 2011, 00:08:38
Visualizzazioni: 152K
Voti: 74

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?

1
Commenti

Dai un'occhiata a questo fantastico articolo su wp_mail() https://www.phparticles.com/wordpress/how-to-use-wp-mail-with-wordpress/

Mr.Happy Mr.Happy
4 ott 2020 15:34:56
Tutte le risposte alla domanda 5
6
175

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 );
26 lug 2015 18:01:32
Commenti

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

deepakssn deepakssn
17 feb 2018 20:54:57

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

Alex Standiford Alex Standiford
6 dic 2019 21:12:35

Questa dovrebbe essere la risposta accettata

CaptainNemo CaptainNemo
27 set 2020 21:49:20

Questa risposta dovrebbe essere quella accettata!

Fernando Torres Fernando Torres
30 giu 2021 23:46:10

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.

Rick Hellewell Rick Hellewell
6 ago 2022 01:37:14

Questa soluzione è di gran lunga superiore perché con la tecnica del add_filter() è troppo facile dimenticare il remove_filter('wp_mail_content_type'); lasciando così le cose in disordine per altri plugin.

Brian C Brian C
8 ott 2023 15:04:17
Mostra i restanti 1 commenti
12
79

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.

7 set 2011 00:23:34
Commenti

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

racl101 racl101
7 set 2011 00:31:04

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.

Milo Milo
7 set 2011 00:45:32

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

Otto Otto
7 set 2011 03:29:46

oh sì, ha ha. Che n00b che sono. Immagino sia l'id di questo post.

racl101 racl101
7 set 2011 10:44:03

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

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

Blowsie Blowsie
28 gen 2013 14:48:30

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

Jeremy Jeremy
2 nov 2016 01:05:40

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

Milo Milo
2 nov 2016 05:20:54

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

Jeremy Jeremy
2 nov 2016 23:12:13

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

Simon Josef Kok Simon Josef Kok
24 ott 2017 09:08:04

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

Flimm Flimm
4 apr 2019 15:31:42

@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

Mark Berry Mark Berry
11 feb 2020 03:22:47
Mostra i restanti 7 commenti
1
14

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

2 gen 2015 16:25:25
Commenti

Questo dovrebbe essere un commento, non una risposta, giusto?

Bob Diego Bob Diego
26 lug 2017 17:31:07
0

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

5 apr 2020 08:39:47
0

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.

5 mar 2020 05:28:13