Category : WordPress

Theme My Loginには、プロフィールを更新した時にメールを送る機能が無いようです。その機能を実装してみます。

関連記事一覧

更新時にメールを送る処理

profile_update フックを利用し、処理を追加しています。

/* functions.php */
function my_user_update_notice($user_id){
    // ユーザー
    $send_to = $_POST['email'];

    // 各種変数
    $obj = array(
        'url' =>  get_bloginfo('url'),
        'name' => get_bloginfo('name'),
        'date' => date_i18n('Y年m月d日 H時i分'),
        'last_name' => $_POST['last_name'],
        'first_name' => $_POST['first_name']
    );

    /* メールタイトル */
    $subject = '【テストサイト名】会員情報が更新されました';

    /* メール本文 EOF内はインデントNG */
$message = <<< EOF
{$obj['last_name']} {$obj['first_name']} さんのプロフィールが更新されましたのでお知らせ致します。
更新日:{$obj['date']}
===================================
このメールは {$obj['name']}({$obj['url']})から送信されました。
EOF;

    wp_mail( $send_to, $subject, $message, 'From:WPテストサイト <no-reply@gmail.com>');
}
add_action('profile_update', 'my_user_update_notice', 20);

更新処理が完了してからメールを送信するため、処理の優先度は低めに設定します。
とりあえずこれで、更新時に通知させることができるようになりました。

メールタイトル、本文などの情報を管理画面から入力させる

メールの本文を変更する際、毎度テーマファイルを変更するのは危険なので、管理画面からメール本文を変更できるようにしてみます。

まず、管理画面に入力枠を作成してみます。
(PHPの囲みを一度閉じてHTMLを記述していますので注意)

/* functions.php */
<?php
・・・
・・・
・・・

/* 管理画面にページ追加 */
function add_menu() {
	add_menu_page('更新通知メール', '更新通知メール', 'level_7', 'set_update_mail', 'set_update_mail');
	add_action('admin_init', 'register_set_update_mail_settings');
}

/* 手動入力させたい項目の設定 */
function register_set_update_mail_settings() {
	// タイトル
	register_setting( 'set_update_mail-group', 'mail-title' );
	// 本文
	register_setting( 'set_update_mail-group', 'mail-body' );
	// from名
	register_setting( 'set_update_mail-group', 'mail-from-name' );
	// fromアドレス
	register_setting( 'set_update_mail-group', 'mail-from-address' );
}

/* 管理画面のHTML作成 */
function set_update_mail() {
?>
	<h2>プロフィール更新通知メール</h2></h2>
	<form method="post" action="options.php">
		<?php
			settings_fields( 'set_update_mail-group' );
			do_settings_sections( 'set_update_mail-group' );
		?>
		<label for="mail-from-name">From 名前</label><br>
		<input type="text" id="mail-from-name" class="regular-text" name="mail-from-name" value="<?php echo esc_attr(get_option('mail-from-name')); ?>"><br>
		<label for="mail-from-address">From アドレス</label><br>
		<input type="text" id="mail-from-address" class="regular-text" name="mail-from-address" value="<?php echo esc_attr(get_option('mail-from-address')); ?>"><br>
		<label for="mail-title">メールタイトル</label><br>
		<input type="text" id="mail-title" class="regular-text" name="mail-title" value="<?php echo esc_attr(get_option('mail-title')); ?>"><br>
		<label for="mail-body">メール本文</label><br>
		<textarea id="mail-body" name="mail-body" style="width:500px;height:300px;"><?php echo esc_attr(get_option('mail-body')); ?></textarea><br>
		<?php submit_button(); ?>
	</form>
<?php
}
add_action('admin_menu', 'add_menu');

・・・
・・・
・・・

今回設定しているパラメータは下記の4つです。

  • mail-title:メールタイトル
  • mail-body:メール本文
  • mail-from-name:from名前
  • mail-from-address:fromアドレス

settings_fields、do_settings_sections で作成したグループ名を指定し、フォームのポストボタンは submit_button() を書くだけでOKです。
下記のような画面が作成され、「変更を保存」を押してテキストが保存されていれば、管理画面は完成です。

次に、先述の my_user_update_notice 関数を変更し、管理画面から入力された内容を取得できるようにしてみます。

/* functions.php */
function my_user_update_notice($user_id){
    // ユーザー
    $send_to = $_POST['email'];

    /* メールタイトル */
    $subject = get_option('mail-title');

    /* メール本文 */
	$message = get_option('mail-body');

    wp_mail( $send_to, $subject, $message, 'From:'.get_option('mail-from-name').'<' . get_option('mail-from-address') .'>');
}
add_action('profile_update', 'my_user_update_notice', 20);

管理画面で入力された値の取得は get_option で行います。
これで、管理画面からメール本文が設定できるようになりました。

メールの本文内に、動的な項目を入れる

これだとメール本文が固定になるため、動的な項目を入れられるようにしてみます。
今回は、本文内に下記のようなパラメータを入れられるようにしてみます。

  • %last_name% ・・・ ユーザーの姓
  • %first_name% ・・・ ユーザーの名
  • %update_date% ・・・ 更新日時
  • %site_name% ・・・ ブログ名
  • %site_url% ・・・ ブログURL
/* functions.php */
function my_user_update_notice($user_id){
    // ユーザー
    $send_to = $_POST['email'];

    /* メールタイトル */
    $subject = get_option('mail-title');

    /* メール本文 */
    /* 置換変数 */
    $obj = array(
        '%site_url%' =>  get_bloginfo('url'),
        '%site_name%' => get_bloginfo('name'),
        '%update_date%' => date_i18n('Y年m月d日 H時i分'),
        '%last_name%' => $_POST['last_name'],
        '%first_name%' => $_POST['first_name']
    );

    $search = array_keys( $obj );
    $replace = array_values( $obj );
    $message = str_replace( $search, $replace, get_option('mail-body') );
    
    wp_mail( $send_to, $subject, $message, 'From:'.get_option('mail-from-name').'<' . get_option('mail-from-address') .'>');
}
add_action('profile_update', 'my_user_update_notice', 20);

単に%で囲われた箇所を置換しているだけの処理ですね。
これで本文内に、任意の場所に動的な項目を入れられるようになりました。

利用できるパラメータの説明文を追加して、完成です。

参考

関連記事一覧