是否有一个action_hook或类似的东西可以帮助我实现这一目标?

我尝试在PHP字符串变量中添加标记,然后使用wp_mail()函数触发了电子邮件,如下所示:

$email_to = 'someaddress@gmail.com';
$email_subject = 'Email subject';
$email_body = "<html><body><h1>Hello World!</h1></body></html>";
$send_mail = wp_mail($email_to, $email_subject, $email_body);


却显示为纯文本?

有什么想法吗?

评论

在wp_mail()phparticles.com/wordpress/how-to-use-wp-mail-with-wordpress上查看此精彩文章

#1 楼

来自wp_mail Codex页面:


默认内容类型为'text / plain',不允许使用HTML。但是,您可以使用“ wp_mail_content_type”过滤器设置电子邮件的内容类型。


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


评论


嗯,听起来很有用。只是一个问题,为什么要命名函数wpse27856_set_content_type的任何特定原因?

–racl101
2011年9月6日在21:31

不,它只是基于此特定问题的ID的唯一名称。 wpse = wp stachexchange,27856是URL中此问题的ID。我这样做是为了避免人们在此处复制/粘贴代码时可能发生的冲突。

–米洛
2011年9月6日在21:45

您也可以仅在电子邮件标题中包含Content-Type。看看Notifly插件是如何做到的。

–奥托
2011年9月7日下午0:29

这将破坏您的密码重置电子邮件,因为重置链接包含在<>中。

–西蒙·约瑟夫·角
17-10-24在6:08

@SimonJosefKok,如果我正确阅读了此错误报告,从WordPress 5.4开始,解决了密码重置电子邮件中断的问题。听起来他们决定从电子邮件地址中删除尖括号。 core.trac.wordpress.org/ticket/23578#comment:24

–马克·贝瑞(Mark Berry)
2月11日在1:22



#2 楼

或者,可以在$ headers参数中指定Content-Type HTTP标头:

$to = 'sendto@example.com';
$subject = 'The subject';
$body = 'The email body content';
$headers = array('Content-Type: text/html; charset=UTF-8');

wp_mail( $to, $subject, $body, $headers );


评论


由于add_filter有时显示为附件,因此效果更好。感谢分享!

– deepakssn
18年2月17日在18:54

这通常是执行此操作的最佳方法。最佳答案将干扰其他插件并引起问题。

– Alex Standiford
19/12/6在19:12

这应该是公认的答案

–尼莫船长
9月27日18:49

#3 楼

使用wp_mail函数后,请不要忘记删除内容类型过滤器。
按照接受的答案命名,您应该在执行wp_mail之后执行以下操作:

remove_filter( 'wp_mail_content_type','wpse27856_set_content_type' );


在此处检查此票证-重置内容类型以避免冲突-http://core.trac.wordpress.org/ticket/23578

评论


这应该是评论,而不是答案,不是吗?

–鲍勃·迭戈
17年7月26日在14:31

#4 楼

我将在下面分享另一种简单的方法。甚至您也可以根据需要设置邮件正文的样式。

$email_to = 'someaddress@gmail.com';
$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 );


有关PHP的更多信息heredoc语法https://www.php.net/manual/zh/language.types.string.php# language.types.string.syntax.heredoc

#5 楼

使用ob_start,因为这将允许您使用WP变量/函数,例如bloginfo等。

创建一个PHP文件并将HTML粘贴到该文件中(如果需要,请在该php文件中使用wp变量)。 br />
使用以下代码:

 $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 <test@test.com>');
 wp_mail( $to, $subject, $body, $headers );


这将使您的代码保持干净,并且由于ob_start,我们还将节省加载文件的时间。