2026年5月20日
2026年5月20日
WordPressの通知メールをカスタマイズする方法|件名・本文・送信先をフィルターで変える
WordPress は、ユーザー登録やコメント投稿、パスワードのリセットなどのタイミングで自動的にメールを送ります。件名や本文を自分のサイトに合わせたい、送信先を増やしたい、不要な通知を止めたいといった変更は、WordPress 本体が用意しているフィルターでできます。
この記事のフック名と引数は、WordPress 本体のソースコード(wp-includes/pluggable.php・wp-includes/user.php)で2026年11月時点に確認したものです。
コードを置く場所
以下のコードは、子テーマの functions.php か、wp-content/mu-plugins/ に置く PHP ファイル(例: mail-custom.php)に書きます。テーマを変えても通知の設定を残したい場合は mu-plugin が向いています。mu-plugin のファイルは先頭に <?php を書くだけで読み込まれ、管理画面から無効化されることもありません。
どのメールをどのフィルターで変えるか
| 通知メール | 宛先 | 変えるフィルター | 止める方法 |
|---|---|---|---|
| 新規ユーザー登録(管理者宛) | 管理者メールアドレス | wp_new_user_notification_email_admin |
wp_send_new_user_notification_to_admin で false |
| 新規ユーザー登録(本人宛・パスワード設定リンク) | 登録したユーザー | wp_new_user_notification_email |
止めるとパスワードを設定できなくなるので止めない |
| 新しいコメント | 投稿者 | comment_notification_subject・comment_notification_text・comment_notification_recipients |
「設定」→「ディスカッション」、または notify_post_author |
| 承認待ちのコメント | 管理者と投稿の作成者 | comment_moderation_subject・comment_moderation_text・comment_moderation_recipients |
「設定」→「ディスカッション」、または notify_moderator |
| パスワードリセット | 本人 | retrieve_password_title・retrieve_password_message・retrieve_password_notification_email |
止めない(リセットできなくなる) |
| パスワードが変更された(管理者宛) | 管理者メールアドレス | wp_password_change_notification_email |
remove_action で外す |
| パスワードが変更された(本人宛) | 本人 | password_change_email |
send_password_change_email で false |
wp_send_new_user_notification_to_admin は WordPress 6.1、retrieve_password_notification_email は 6.0 で追加されたフィルターです。それより古い WordPress では使えません。
送信元の名前とアドレスを変える
何も設定しないと、送信元は wordpress@サイトのドメイン、名前は「WordPress」になります。次のフィルターで変えられます。
add_filter( 'wp_mail_from', function ( $from_email ) {
return 'no-reply@example.com';
} );
add_filter( 'wp_mail_from_name', function ( $from_name ) {
return 'サンプルサイト';
} );
送信元のドメインは、サイトのドメインか、SPF・DKIM を設定したドメインにしてください。そうでないと迷惑メールと判定されやすくなります。詳しくは WordPressの送信元メールアドレスを変更する方法 と SMTPプラグインの比較 を参照してください。
新規ユーザー登録の通知を変える
登録時のメールは wp_new_user_notification() が作り、管理者宛と本人宛の2通を送ります。どちらも to・subject・message・headers を持つ配列をフィルターに渡すので、必要な要素だけ書き換えて返します。
// 管理者宛: 送信先と本文を変える
add_filter( 'wp_new_user_notification_email_admin', function ( $email, $user, $blogname ) {
$email['to'] = 'members@example.com';
$email['subject'] = '[%s] 新しい会員が登録されました';
$email['message'] = sprintf(
"新しいユーザーが登録されました。\r\n\r\nユーザー名: %s\r\nメール: %s\r\nユーザー一覧: %s\r\n",
$user->user_login,
$user->user_email,
admin_url( 'users.php' )
);
return $email;
}, 10, 3 );
// 本人宛: パスワード設定リンクを含む元の本文の前に挨拶を足す
add_filter( 'wp_new_user_notification_email', function ( $email, $user, $blogname ) {
$email['subject'] = '[%s] ご登録ありがとうございます';
$email['message'] = $user->display_name . " 様\r\n\r\nご登録ありがとうございます。\r\n\r\n" . $email['message'];
return $email;
}, 10, 3 );
注意点は2つあります。
- 件名は送信直前に
sprintf()に通されるため、%sの位置にサイト名が入ります。件名に%を文字として入れたいときは%%と書きます。 - 本人宛のメールにはパスワード設定用のリンクが入っています。本文を丸ごと差し替えるとリンクが消えて、新しいユーザーがログインできなくなります。上の例のように元の本文(
$email['message'])を残してください。
管理者宛のメールだけを止めたい場合は、次の1行で足ります。
add_filter( 'wp_send_new_user_notification_to_admin', '__return_false' );
register_new_user から wp_send_new_user_notifications を remove_action で外す方法は、本人宛のパスワード設定メールまで止まってしまうので、目的が管理者宛の変更だけなら使わないでください。
コメントの通知を変える
コメントの通知を送るかどうかは、まず管理画面の「設定」→「ディスカッション」の「自分宛のメール通知」で決まります。
- 「コメントが投稿されたとき」: 投稿の作成者に新着コメントを知らせる
- 「コメントがモデレーションのために保留されたとき」: 管理者と投稿の作成者に承認待ちを知らせる
件名と送信先は次のように変えます。第2引数のコメント ID は数字の文字列で渡されます。
// 新着コメントの件名
add_filter( 'comment_notification_subject', function ( $subject, $comment_id ) {
$comment = get_comment( $comment_id );
return sprintf( '[新着コメント] 「%s」', get_the_title( $comment->comment_post_ID ) );
}, 10, 2 );
// 承認待ちコメントの件名
add_filter( 'comment_moderation_subject', function ( $subject, $comment_id ) {
$comment = get_comment( $comment_id );
return sprintf( '[承認待ち] 「%s」へのコメント', get_the_title( $comment->comment_post_ID ) );
}, 10, 2 );
// 承認待ちの通知を編集担当にも送る
add_filter( 'comment_moderation_recipients', function ( $emails, $comment_id ) {
$emails[] = 'editor@example.com';
return array_unique( $emails );
}, 10, 2 );
// 「news」カテゴリーの投稿への新着コメントは通知しない
add_filter( 'comment_notification_recipients', function ( $emails, $comment_id ) {
$comment = get_comment( $comment_id );
if ( has_category( 'news', (int) $comment->comment_post_ID ) ) {
return array();
}
return $emails;
}, 10, 2 );
comment_notification_recipients で空の配列を返すと、その通知は送られません。本文を変えたい場合は comment_notification_text・comment_moderation_text に同じ形でフィルターを掛けます。
パスワードリセットのメールを変える
「パスワードをお忘れですか ?」から送られるメールは retrieve_password() が作ります。件名は retrieve_password_title、本文は retrieve_password_message で変えます。本文のフィルターには、リセット用のキー($key)が第2引数で渡されるので、そこからリセット用 URL を組み立てます。URL の形は WordPress 本体と同じにしてください。
add_filter( 'retrieve_password_title', function ( $title, $user_login, $user_data ) {
return sprintf( '[%s] パスワード再設定のご案内', wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES ) );
}, 10, 3 );
add_filter( 'retrieve_password_message', function ( $message, $key, $user_login, $user_data ) {
$reset_url = network_site_url(
'wp-login.php?login=' . rawurlencode( $user_login ) . "&key=$key&action=rp",
'login'
);
return sprintf(
"%s 様\r\n\r\nパスワード再設定のご依頼を受け付けました。\r\n次の URL から新しいパスワードを設定してください。\r\n\r\n%s\r\n\r\nお心当たりがない場合は、このメールを破棄してください。パスワードは変更されません。\r\n",
$user_data->display_name,
$reset_url
);
}, 10, 4 );
add_filter()の第4引数は、コールバックが受け取る引数の数です。retrieve_password_messageの4つの引数をすべて使うには10, 4と指定します(10 は優先度)。retrieve_password_messageで空の文字列を返すと、メールは送られません。- リセット用リンクの有効期限は、標準で1日です(
password_reset_expirationフィルターで変えられます)。本文に期限を書く場合は、この値と合わせてください。
WordPress 6.0 以降では、件名・本文・宛先・ヘッダーをまとめて受け取る retrieve_password_notification_email も使えます。リセットメールについては パスワードリセットメールをカスタマイズする方法 でも詳しく説明しています。
パスワード変更の通知を変える・止める
ユーザーがパスワードをリセットすると、管理者に「パスワードが変更されました」というメールが届きます(変更したのが管理者メールアドレスのユーザー自身なら送られません)。この通知は after_password_reset アクションに登録された wp_password_change_notification() が送っています。
// 管理者宛の通知の件名を変える(件名は sprintf に通されるので %s を残す)
add_filter( 'wp_password_change_notification_email', function ( $email, $user, $blogname ) {
$email['subject'] = '[%s] ユーザーのパスワードが変更されました';
return $email;
}, 10, 3 );
// 管理者宛の通知を止める
remove_action( 'after_password_reset', 'wp_password_change_notification' );
ユーザーがプロフィール画面でパスワードを変えたときに本人へ届く確認メールは、send_password_change_email で止められます。本人が気づかないうちにパスワードを変えられた場合の手がかりになるメールなので、止めるかどうかは慎重に判断してください。
add_filter( 'send_password_change_email', '__return_false' );
HTML メールにする
wp_mail_content_type フィルターで全体を text/html にすると、WordPress 本体やプラグインが送るテキスト形式のメールも HTML として扱われ、改行が消えて1行に詰まって表示されます。HTML にしたいメールだけ、headers に Content-Type を指定してください。
// 管理者宛の新規登録通知だけを HTML にする
add_filter( 'wp_new_user_notification_email_admin', function ( $email, $user, $blogname ) {
$email['headers'] = array( 'Content-Type: text/html; charset=UTF-8' );
$email['message'] = sprintf(
'<p>新しいユーザーが登録されました。</p><ul><li>ユーザー名: %s</li><li>メール: %s</li></ul><p><a href="%s">ユーザー一覧を開く</a></p>',
esc_html( $user->user_login ),
esc_html( $user->user_email ),
esc_url( admin_url( 'users.php' ) )
);
return $email;
}, 20, 3 );
本文に入れるユーザー名やメールアドレスは esc_html()、URL は esc_url() を通してから HTML に埋め込みます。
変更を確かめる
- テスト用のメールアドレスでユーザーを登録し、管理者宛と本人宛のメールを確認する
- ログアウトした状態で「パスワードをお忘れですか ?」からリセットメールを送り、リンクから新しいパスワードを設定できるか確かめる
- コメントを投稿し、通知が想定した宛先に届くか確かめる
メール自体が届かない場合は、フィルターではなく送信の経路に原因があることがほとんどです。WordPressの確認メールが届かないときの対処 を参照してください。