The question:
Is there an action_hook or something similar that could help me achieve this?
I tried adding markup in a PHP string variable and just fired off an email with the wp_mail()
function like so:
$email_to = '[email protected]';
$email_subject = 'Email subject';
$email_body = "<html><body><h1>Hello World!</h1></body></html>";
$send_mail = wp_mail($email_to, $email_subject, $email_body);
But it showed up as plain text?
Any ideas?
The Solutions:
Below are the methods you can try. The first solution is probably the best. Try others if the first one doesn’t work. Senior developers aren’t just copying/pasting – they read the methods carefully & apply them wisely to each case.
Method 1
from wp_mail codex page:
The default content type is ‘text/plain’ which does not allow using HTML. However, you can set the content type of the email by using the ‘wp_mail_content_type’ filter.
// In theme's functions.php or plug-in code:
function wpse27856_set_content_type(){
return "text/html";
}
add_filter( 'wp_mail_content_type','wpse27856_set_content_type' );
Method 2
As an alternative, you can specify the Content-Type HTTP header in the $headers parameter:
$to = '[email protected]';
$subject = 'The subject';
$body = 'The email body content';
$headers = array('Content-Type: text/html; charset=UTF-8');
wp_mail( $to, $subject, $body, $headers );
Method 3
Don’t forget to remove the content type filter after you use the wp_mail function.
Following the accepted answer naming you should do this after wp_mail is executed:
remove_filter( 'wp_mail_content_type','wpse27856_set_content_type' );
Check this ticket here – Reset content-type to avoid conflicts — http://core.trac.wordpress.org/ticket/23578
Method 4
Another easy way I’m going to share below. Even you can style your mail body as your wish. Maybe it’s helpful for you.
$email_to = '[email protected]';
$email_subject = 'Email subject';
// <<<EOD it is PHP heredoc syntax
$email_body = <<<EOD
This is your new <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 );
More about PHP heredoc syntax https://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc
Method 5
Use ob_start
, because this will allow you to use WP variables/functions like bloginfo etc.
make a PHP file and paste your HTML in that file(use wp variables inside that php file if needed).
Use the below code:
$to = 'Email Address';
$subject = 'Your Subject';
ob_start();
include(get_stylesheet_directory() . '/email-template.php');//Template File Path
$body = ob_get_contents();
ob_end_clean();
$headers = array('Content-Type: text/html; charset=UTF-8','From: Test <[email protected]>');
wp_mail( $to, $subject, $body, $headers );
this will keep your code clean and due to ob_start we will also save the time of loading the file.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0