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()
を追加しますが、ここにはありません。
このようなフックを実装したのではないでしょうか。
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 );
この方法は私にとっては$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 );
これは技術的に質問に答えるものではありません - 質問の背後にあるより多くの質問です。パスワード再設定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
として).