仅对于丢失密码的电子邮件,将内容类型设置为HTML

时间:2017-12-08 作者:jmock

是否有办法仅更改密码重置电子邮件的内容类型?

我有一个自定义的HTML模板,并已将wp\\u mail\\u content\\u type设置为文本/HTML,并且正在使用带有“retrieve\\u password\\u message”过滤器的模板。这一切都很好,我收到了一封HTML电子邮件,但我很难弄清楚在哪里/如何重置wp\\u mail\\u content\\u类型,因为我实际上没有在任何地方调用wp\\u mail()。

任何帮助都将不胜感激。

编辑-这是我正在使用的代码。

这是更改内容类型的函数:

function xxx_wp_email_content_type() {
    return \'text/html\';
}
add_filter( \'wp_mail_content_type\', \'xxx_wp_email_content_type\' );
下面是更改电子邮件本身的功能:

function xxx_wp_retrieve_password_message( $content, $key ) {
    ob_start();

    $email_subject = xxx_wp_retrieve_password_title();

    include( \'templates/email_header.php\' );
    include( \'templates/lost_password_email.php\' );
    include( \'templates/email_footer.php\' );

    $message = ob_get_contents();
    ob_end_clean();

    return $message;
}
add_filter( \'retrieve_password_message\', \'xxx_wp_retrieve_password_message\', 10, 2 );
通常我会添加remove_filter( \'wp_mail_content_type\', \'xxx_wp_email_content_type\' ); 在致电之后wp_mail(), 但这里没有。

3 个回复
最合适的回答,由SO网友:signal2013 整理而成

我怀疑你实现了这样的钩子:

function wp_set_html_mail_content_type() {
    return \'text/html\';
}
add_filter( \'wp_mail_content_type\', \'wp_set_html_mail_content_type\' );
更多信息:https://codex.wordpress.org/Plugin_API/Filter_Reference/wp_mail_content_type

是否需要稍后重置内容类型?

更新:尝试用全局变量拦截它:

function xxx_wp_email_content_type() {
    if($GLOBALS["use_html_content_type"]){
        return \'text/html\';
    }else{
        return \'text/plain\';
    }
}
add_filter( \'wp_mail_content_type\', \'xxx_wp_email_content_type\' );

function xxx_wp_retrieve_password_message( $content, $key ) {
    ob_start();

    $GLOBALS["use_html_content_type"] = TRUE;

    $email_subject = xxx_wp_retrieve_password_title();

    include( \'templates/email_header.php\' );
    include( \'templates/lost_password_email.php\' );
    include( \'templates/email_footer.php\' );

    $message = ob_get_contents();
    ob_end_clean();

    return $message;
}
add_filter( \'retrieve_password_message\', \'xxx_wp_retrieve_password_message\', 10, 2 );

SO网友:Nathan Powell

这种方式对我很有效,无需设置$GLOBAL:

function xxx_wp_email_content_type() {
    return \'text/html\';
}

function xxx_wp_retrieve_password_message( $content, $key ) {
    add_filter( \'wp_mail_content_type\', \'xxx_wp_email_content_type\' );

    ob_start();

    $email_subject = xxx_wp_retrieve_password_title();

    include( \'templates/email_header.php\' );
    include( \'templates/lost_password_email.php\' );
    include( \'templates/email_footer.php\' );

    $message = ob_get_contents();
    ob_end_clean();

    return $message;
}
add_filter( \'retrieve_password_message\', \'xxx_wp_retrieve_password_message\', 10, 2 );

SO网友:squarecandy

从技术上来说,这并不能回答这个问题,但更多的是问题背后的问题。您可能希望仅为密码重置电子邮件设置内容类型的原因是,将所有系统电子邮件设置为text/html 将破坏默认密码重置电子邮件。

我建议使用retrieve_password_message 过滤器与wp_mail_content_type 筛选以使密码重置电子邮件与HTML格式兼容:

<?php
// adding support for html emails
// this converts ALL wp_mail emails to HTML, which messes up the password reset
add_filter( \'wp_mail_content_type\',\'squarecandy_set_content_type\' );
function squarecandy_set_content_type() {
        return "text/html";
}

// add this filter too
// this will make the password reset email compatible with the HTML format
add_filter( \'retrieve_password_message\', \'squarecandy_retrieve_password_message\', 10, 1 );
function squarecandy_retrieve_password_message( $message ) {
    // Revise the message content to make it HTML email compatible
    $message = str_replace(\'<\',\'\',$message);
    $message = str_replace(\'>\',\'\',$message);
    $message = str_replace("\\n",\'<br>\',$message);
    // make any additional modifications to the message here...
    return $message;
}
否则,如果您只想将个人电子邮件设置为text/html, 这个$GLOBALS @signal2013的答案中的方法也有效,但可能更好地应用于针对您的自定义电子邮件,而不是默认的密码重置电子邮件(将此保留为默认设置text/plain).

结束

相关推荐

在MU插件中重新定义wp_password_change_Notify合法吗?

我试图为这个功能添加一些逻辑,即何时提醒管理员密码更改,但根本没有发送电子邮件。codex说它需要在插件中声明,那么这对mu插件是合法的还是只有特定的位置可以重新声明?目前,这大致是我的代码,但邮件从未发出:if(!function_exists(\'wp_password_change_notification\')){ //die(\'I can get here\'); function wp_password_change_notification($user){&