LoginSignup
6
6

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-10-10

エラーテキスト、バリデーションの変更編までで、ひと通り登録の機能を作りました。

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

元記事

下記エントリの転載になります。
WordPressで会員制サイトを構築してみよう(プロフィール更新時にメール通知)

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

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

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

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

参考

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6