web-dev-qa-db-ja.com

パスワードを紛失したEメールのみにコンテンツタイプをHTMLに設定

only /パスワード再設定Eメールのコンテンツタイプを変更する方法はありますか?

カスタムHTMLテンプレートがあり、wp_mail_content_typeをtext/htmlに設定し、retrieve_password_messageにフィルタを適用してテンプレートを適用しています。すべてうまくいってHTMLメールが届きますが、実際にはどこでもwp_mail()を呼び出さないので、wp_mail_content_typeをリセットする場所と方法を特定するのは困難です。

任意の助けは大歓迎です。

編集 - これが私が使っているコードです。

これは、コンテンツタイプを変更する関数です。

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()を追加しますが、ここにはありません。

1
jmock

このようなフックを実装したのではないでしょうか。

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 );
1
signal2013

この方法は私にとっては$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 );
1
Nathan Powell

これは技術的に質問に答えるものではありません - 質問の背後にあるより多くの質問です。パスワード再設定Eメールのみにコンテンツタイプを設定する必要があるのは、すべてのシステムEメールをtext/htmlに設定すると、デフォルトのパスワード再設定Eメールが壊れるためです。

パスワードをリセットする電子メールをHTML形式と互換性のあるものにするために、retrieve_password_messageフィルタをwp_mail_content_typeフィルタと組み合わせて使用​​することをお勧めします。

<?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;
}

それ以外の場合、個々のEメールをtext/htmlに設定するだけの場合は、@ signal2013からの回答にある$GLOBALSメソッドも機能しますが、デフォルトのパスワードリセットEメールではなく custom Eメールをターゲットにする方が適しています。デフォルトのtext/plainとして).

0
squarecandy