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 に埋め込みます。

変更を確かめる

  1. テスト用のメールアドレスでユーザーを登録し、管理者宛と本人宛のメールを確認する
  2. ログアウトした状態で「パスワードをお忘れですか ?」からリセットメールを送り、リンクから新しいパスワードを設定できるか確かめる
  3. コメントを投稿し、通知が想定した宛先に届くか確かめる

メール自体が届かない場合は、フィルターではなく送信の経路に原因があることがほとんどです。WordPressの確認メールが届かないときの対処 を参照してください。

お気軽にご相談ください

お見積りへ お問い合わせへ
▲