Wordpressで会員制サイトを構築してみよう（プロフィール更新時にメール通知）


[エラーテキスト、バリデーションの変更編](http://qiita.com/hiroki_y/items/79a7ca31199ab079b0f7)までで、ひと通り登録の機能を作りました。

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

##元記事
下記エントリの転載になります。
[WordPressで会員制サイトを構築してみよう（プロフィール更新時にメール通知）](http://www.rokurofire.info/2014/10/09/wp_membership5/)


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

```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);

```

profile_update フックを利用し、処理を追加しています。
更新処理が完了してからメールを送信するため、処理の優先度は低めに設定します。
これで、更新時に通知させることができるようになりました。

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

まず、管理画面に入力枠を作成してみます。
（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>
	<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です。
下記のような画面が作成され、「変更を保存」を押してテキストが保存されていれば、管理画面は完成です。

![register6-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/10172/97d5bca9-9b7b-6486-5786-5a824759e972.jpeg "register6-2.jpg")


次に、先述の 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);
```

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

![register6-3.jpg](https://qiita-image-store.s3.amazonaws.com/0/10172/bc2c1e0e-6640-75c6-f351-05b8113ba161.jpeg "register6-3.jpg")

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


##参考

* [WordPress の管理画面にオリジナルの設定ページを追加する方法](http://h2ham.net/wordpress-creating-options-pages)
* [Administration Menus « WordPress Codex](http://codex.wordpress.org/Adding_Administration_Menus)