2020.04.15

WordPressで最新記事を抽出してメルマガを自動で作成&送信する方法

こんにちは、webエンジニアのゾノ( @ozonosho )です。

さて、今回の記事ではWordPressで最新記事を抽出してメルマガを自動で作成&送信する方法を紹介したいと思います。

毎週月曜日に1週間分の新着記事を掲載してくれるメルマガを全自動で作成し、指定した権限を持つユーザーにたいして自動で一斉送信してくれる機能です。人の手が一切かからないのでメチャ便利です。

具体的な仕様は下記のとおりです。

◆今回制作するメルマガの仕様
  • 1週間ごとに新着記事5件を掲載したメルマガを自動作成
  • 1週間の新着記事が5件に満たない場合は足りない記事数分を過去記事から抽出する
  • 作成したメルマガは特定の権限を持つユーザーにたいして毎週月曜日に一斉送信する

それでは実際の実装方法を見てみましょう。

送信されるメルマガの掲載内容

先に、今回作るメルマガの掲載内容を共有しておきます。

【Cree|今週のメルマガ #2020年4月14日】

〇〇さん(←登録名称)

今週の新着記事をお知らせいたします。

『1つめの記事のタイトル』
1つめの記事のURL

『2つめの記事のタイトル』
2つめの記事のURL

『3つめの記事のタイトル』
3つめの記事のURL

『4つめの記事のタイトル』
4つめの記事のURL

『5つめの記事のタイトル』
5つめの記事のURL

それでは、今週も素敵な1週間をお過ごしください。

アレンジしやすいように、こんな感じのシンプルなメルマガを作ります。

実装コードはこちら

下記のコードをfunctions.phpに追加してください。

function send_newsletter() {

  /*----------
  ①メルマガ作成
  ----------*/

  //標準時間をセット
  date_default_timezone_set('Asia/Tokyo');
  //1週間前の日付を取得
  $startDay = date('Y/m/d', strtotime('-1 week'));
  //今日の日付を取得
  $endDay = date('Y/m/d');

  //表示させる記事の件数
  $count = 5;

  //1週間以内に追加された記事を取得
  $args = array(
    'post_type' => 'post',
    'posts_per_page' => $count,
    'date_query' => array(
       array(
         'compare' => 'BETWEEN',
         'inclusive' => true,
         'after' => $startDay,
         'before' => $endDay
       ),
    ),
  );
  $the_query = new WP_Query($args);
  $post_list = '';
  $not_list = null;
  if($the_query->have_posts()) :
    while($the_query->have_posts()) : $the_query->the_post();
      $post_list .= '『' . get_the_title() . '』' . "\r\n";
      $post_list .= get_the_permalink() . "\r\n\r\n";
      //すでに抽出した記事IDを配列に格納
      $not_list[] = get_the_ID();
    endwhile;
    wp_reset_postdata();
  endif;

  //1週間以内に追加された記事が表示させたい件数に満たなかった時は過去記事から足りない分を取得
  if(count($not_list) < $count) :
    //足りない記事数
    $rest_count = $count - count($not_list);
    $args = array( 
      'post_type' => 'post',
      'posts_per_page' => $rest_count,
      'post__not_in' => $not_list, //すでに抽出済みの記事は対象から外す
      'orderby' => 'rand', //ランダム抽出
    );
    $the_query = new WP_Query($args);
    if($the_query->have_posts()) :
      while($the_query->have_posts()) : $the_query->the_post();
        $post_list .= '『' . get_the_title() . '』' . "\r\n";
        $post_list .= get_the_permalink() . "\r\n\r\n";
      endwhile;
      wp_reset_postdata();
    endif;
  endif;

  /*----------
  ②メルマガ送信
  ----------*/

  //メルマガ送信元情報
  $headers = 'From: Cree <info@tsukuriba.co.jp>' . "\r\n";
  //メルマガタイトル
  $title = 'Cree|今週のメルマガ #' . date("Y年n月j日");
  //メルマガ本文
  $content = '今週の新着記事をお知らせいたします。' . "\r\n\r\n" . $post_list . "\r\n" . '
それでは、今週も素敵な1週間をお過ごしください。';

  //特定の権限のユーザーを対象にしてメルマガ送信
  $args = array(
    'role__in' => array('administrator', 'merumaga-member') //コメントアウトすればすべてのユーザー対象
  );
  $user_query = new WP_User_Query($args);
  if(!empty($user_query->results)) {
    foreach($user_query->results as $user) {
      //ユーザーの登録アドレスを取得
      $to = $user->user_email;
      //メルマガ本文の冒頭に登録名称(ニックネーム)を加える
      $body = $user->nickname . 'さん' . "\r\n\r\n" . $content;
      //メルマガ送信
      wp_mail($to, $title, $body, $headers);
    }
  }
}
/*----------
  ③アクションフックに追加
----------*/
add_action ( 'cron_send_newsletter', 'send_newsletter' );

これで自動で最新記事を抽出してメルマガを作成&送信する機能を実装できます。

尚、各処理の説明はコメントに記載してあります。コメント内容を参考にして、ご自身の作りたいメルマガに合わせて適宜内容を変更してご利用いただければと思います。

cronで定期実行させれば毎週月曜日に送信できます

ご自身のメルマガ用のコードを実装したら、最後は③で追加したアクションフックを利用してこの関数をcron等で定期実行させてあげてください。

プラグイン『WP Crontrol』を利用するとWordPress固有のcron「WP-Cron」の設定を視覚化できるのでおすすめです。とても簡単に設定できます。

アレンジもぜひお試しください

今回紹介したコードのように「WP_Query」「WP_User_Query」の2つを利用すれば、サイト内に登録されているすべての「記事(固定ページやカスタム投稿タイプも含む)」「ユーザーの情報」を好きな条件で抽出できるので、ぜひ色々アレンジしてみてください。

例えば僕の場合だと、

  • アクティブなユーザーを表彰するコンテンツを掲載
  • PV数順に記事を取得して人気ランキングを掲載
  • 毎週イチオシの掲示板トピック(カスタム投稿)をピックアップ

こんな感じのメルマガに仕上げています。

全自動のメルマガとはいえ工夫次第で機械的じゃない内容に仕上げることも可能だなと感じます。
(もし作りたいメルマガがある場合は気軽にご相談ください!)

おわりに

以上、今回の記事ではWordPressで最新記事を抽出してメルマガを自動で作成&送信する方法を紹介させていただきました。

当サイトではWordPressのカスタマイズ依頼を請け負っています。実現したい機能・要望がある方はぜひ下記ページよりご相談ください。

あなたのサイトに理想の機能を実装!WordPressカスタマイズサービス

本サービスはあなたのWordPressサイトに理想の機能を実装するサービスとなります。 どのような機能・要望でも実現可能です! Wo......

→この記事を読む