メンバー限定サイトで、記事ごとにユーザーを選択し、閲覧権限を与えているサイトがありました。
その選択したユーザーに、記事が公開されたことをメール通知したい…とのことだったので、functions.phpに記述してなんとか実装。
特定のメールアドレスに送信するだけだったら、下記の参考記事で実現できたのですが、記事ごとに送信先メールアドレスが異なるので少し難しかったです。
【WordPress】新しい記事を投稿した際に、指定のメールアドレス宛にメール通知する方法
カスタムフィールドでユーザー指定
まず、カスタムフィールド「user_select」(複数選択可のセレクトボックス)を作成し、返り値はUser IDに設定します。
Advancesd Custom Fieldsでは、フィールドタイプ「ユーザー」がありました。
これで記事ごとにユーザーを選択できます。
ユーザーにメールアドレスを設定
ユーザーのプロフィールで、きちんとしたメールアドレスを設定しておいてください。
あまり使うことがないので、適当なメールアドレスを設定する場合があるので…。
実際のコード
functions.phpに下記のコードを追記します。
ユーザーが複数選択される前提でコードを書いています。
絶対に1ユーザーしか指定しないとなれば、もっと簡単かも。
/* ================================= 投稿時に指定ユーザーにメール通知 ================================= */ add_action('transition_post_status', function($new_status, $old_status, $post) { //「新規投稿」、「承認待ち」、「下書き」、「自動保存」、「予約済」のステータスから「公開済」に変化した時に処理が行われる。 if(($old_status == 'new' || $old_status == 'pending' || $old_status == 'draft' || $old_status == 'auto-draft' || $old_status == 'future') && $new_status == 'publish' && $post->post_type == 'post') { $user_select = get_field('user_select', $post->ID); //カスタムフィールド「user_select」を取得(返り値はUser ID) $user_emaillist = array(); //空の配列を定義 foreach($user_select as $user_id){ $user_data = get_userdata($user_id); //ユーザーIDからユーザー情報を取得 $user_email = $user_data->user_email; //ユーザー情報の中からメールアドレスを取得 array_push($user_emaillist, $user_email); //取得したメールアドレスを$user_emaillistに追加していく } $mail_to = implode(',', $user_emaillist); //メールアドレスだけの配列をカンマ区切りの文字列にして$mail_toに代入 // 送信先のメールアドレス $to = $mail_to; // 件名 $subject = '[サイト名] 新しい記事が公開されました'; // 本文 $message = $post->post_title . "\n"; $message .= get_permalink($post->ID); // FromやReply-Toを記述。WordPressの一般設定で設定しているメールアドレスをFromにする場合は空配列。 $headers = []; // 添付ファイルがあればファイルパスを記述 $attachments = []; wp_mail($to, $subject, $message, $headers, $attachments); } }, 10, 3);
また、選択したユーザー以外のメールアドレス(固定)を追加で指定したい場合は、「送信先のメールアドレス」部分を下記のようにすればOKです。
例)選択したユーザー+「mail@example.com」に通知メールを送信
$to = $mail_to .'mail@example.com';
1つ落とし穴が…
これで完成〜と思ったけど、よく試してみると、新規投稿でそのまま公開をしてもメールが来ないんです。
どうやら自動保存のステータスが取得できていないようで…。
一度「下書き保存」を押してからじゃないと、このプログラムは動きませんでした。
何をどうすれば良いのやら。。教えて詳しい人(T_T)