2020.03.11

WordPressでアメブロ特定テーマの記事を自動で記事化する機能を作ってみよう④【おまけ編】

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

さて、全3回に渡って実装してきたWordPressでアメブロ特定テーマの記事を自動で記事化する機能は一応のところ昨日のブログで完結しました。

しかし、昨日のブログで紹介したコードだとcronに登録して自動実行されるようにするためには引数を動的に渡す必要があるせいかその部分で質問が届いたので、今回はおまけとして「僕のサイトでの実装コード」をそのままご紹介いたします。

関数で紹介する形になりますが、この関数で出来ることは下記のとおりです。

前提
  • WordPressユーザーのカスタムフィールドに「アメブロID」「アメブロテーマID」の2つをセットしておく
  • 実装した関数はwp-cron等のcronを利用して毎日深夜0時に自動実行する
  • アメブロで特定のテーマ(=ブログカテゴリー)で書いた記事をWordPressで管理している別サイトに転送して記事化する
仕様
  • WordPressユーザーの情報を取得して「アメブロID」「アメブロテーマID」がセットされているユーザーがいれば処理を実施
  • 指定した「アメブロID」「アメブロテーマID」の記事のうち、前日に書かれた記事があれば取得
  • 取得した記事はWordPressの投稿データに変換して「本番公開前(pending)状態」で保存

こんな感じです!

これらを叶えてくれる関数がこちら

下記のコードをfunctions.phpに追加すればどなたでも利用できます。

//アメブロRSSから自動記事作成
function create_post_by_ameblo_feed() {

  //指定した権限のユーザー一覧を取得
  $users = get_users('role=mama-staff'); //※①

  foreach ($users as $user) {

    //アメブロIDとアメブロテーマIDが登録されている場合のみ処理を実行
    if($user->ameblo_id && $user->ameblo_theme_id) { //※②

      //RSS配信URL
      $url = 'http://rssblog.ameba.jp/' . $user->ameblo_id . '/rss20.xml';

      //RSSデータを取得
      $feed = fetch_feed($url);

      //RSSデータ取得時にエラーが出たら処理終了
      if(is_wp_error($feed)) exit;

      //一応取得件数の最大値を定義しておく
      $count = 5;
      $maxitems = $feed->get_item_quantity($count);
      //指定した件数のRSSデータを格納
      $rss_items = $feed->get_items(0, $maxitems);

      //今回は利用しないが↓でブログのメインタイトルやURLを取得できる
      $title = $feed->get_title();
      $site_url = $feed->get_permalink();

      //標準時間セット
      date_default_timezone_set('Asia/Tokyo');
      //昨日の日付を変数に格納
      $yesterday = date('Y-m-d', strtotime('-1 day'));

      //RSSデータの中身を1つずつ取り出す
      foreach($rss_items as $item) {

        //昨日更新された記事かどうかを判別(違う場合は次のループへ)
        if($item->get_date('Y-m-d') != $yesterday) continue;

        //記事のURLからエントリーID情報を抜き出す
        preg_match('/entry-(\d+).html/', esc_url($item->get_permalink()), $match);

        //エントリーID情報が入っていなければ次のループへ
        if(count($match) < 2) continue;

        //見つかったエントリーID情報を変数に格納
        $entry_id = $match[1];

        //該当記事のアメブロページのHTMLソースをすべて抜き出す
        $html = file_get_contents(esc_url($item->get_permalink()));

        //現ループの記事のentryIDとthemeNameの間に入っているHTMLソースを抜き出すための正規表現パターン
        $pattern = '/entry_id":' . $entry_id . '(.*?)theme_name/';

        //↑の条件でHTMLソースを抜き出す
        if(preg_match($pattern, $html, $result)) {

          //現ループの記事が指定テーマだった場合
          if(strpos($result[0], $user->ameblo_theme_id) !== false) {

            $content = $item->get_content();
            $content = str_replace('<p>&nbsp;</p>', '<br>', $content);
            $content = str_replace('<p>', '', $content);
            $content = str_replace('</p>', '<br>', $content);

            //投稿データ用の配列を作成
            $my_post = array(
              'post_type'     => 'post', //投稿タイプ
              'post_title'    => esc_html($item->get_title()), //記事タイトル
              'post_content'  => $content, //記事本文
              'post_date'     => $yesterday, //投稿日付
              'post_status'   => 'pending', //公開ステータス
              'post_author'   => $user->ID, //著者のユーザーID
              'post_category' => 1, //関連付けるカテゴリーID
              'tags_input'    => array('noindex') //関連付けるタグスラッグ
            );

            //投稿データを登録
            if(wp_insert_post($my_post)) {
              //投稿データの登録に成功した場合、カスタムフィールドの値もあれば保存する
              //update_post_meta($insert_id, 'key', 'value');
            } else {
              continue;
            }
          }
        }
      }
    }
  }
}
add_action ( 'cron_create_post_by_ameblo_feed', 'create_post_by_ameblo_feed' ); //※③

※①について
僕のサイトでは権限を指定してユーザーを取得するために「role=mama-staff」を入れていますが、指定しない場合は空で構いません。

※②について
アメブロIDのカスタムフィールドkeyを「ameblo_id」、テーマIDのカスタムフィールドkeyを「ameblo_theme_id」に設定しています。keyのネームを違う値にした場合はご自身の設定に合わせて変更してください。

※③について
wp-cronに登録するために作成した関数をアクションフックに登録しています。

おわりに

以上、今回はWordPressでアメブロ特定テーマの記事を自動で記事化する機能のおまけでした(*´`)

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

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

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

→この記事を読む