2020.03.10

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

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

さて、昨日のブログに続いて今回もWordPressでアメブロ特定テーマの記事を自動で記事化する機能に挑戦していこうと思います。

おさらいしておくと、作りたい機能の仕様は下記のとおりです。

仕様
  • アメブロで特定のテーマ(=ブログカテゴリー)で書いた記事をWordPressで管理している別サイトに転送して記事化する
  • 転送は毎日深夜0時に自動でおこなう(前日分の記事を転送)
  • 重複ペナルティーを避けるために転送先の記事には「nofollow」「noindex」を加える

昨日はアメブロで書かれた記事のうち指定したテーマの記事だけ取り出してWordPress側に表示することに成功しました。

その後コーディングを進めて、ついに、この機能を完成させることができました^^

完成したコードがこちら!

WordPressでアメブロ特定テーマの記事を自動で記事化する機能

「アメブロID」と「テーマID」の2つの情報を渡したら前日分のアメブロ該当記事をWordPressで記事化してくれる関数を用意しました。

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

//アメブロRSSから自動記事作成
function create_post_by_ameblo_feed($ameblo_id, $theme_id, $count=5) {

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

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

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

  //一応取得件数の最大値を定義しておく
  $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], $theme_id) !== false) {

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

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

転送した記事をWordPress側でどの「著者」「カテゴリー」に設定するかはそれぞれだと思いますので、ご自身の環境に合わせて書き換えて使ってください。

補足①「nofollow」「noindex」はタグで対応しました

記事データ自体にメタタグの設定を持たせることはできないので、かわりに任意のタグをつけて、そのタグがついている記事には「nofollow」「noindex」が入るようにしました。

補足②毎日深夜0時の自動実行はwp-cronで設定しました

関数さえ作ってしまえば、あとはこっちのもの。最終的にはcronに登録して、毎日決まった時間に処理を実行させるようにしました。

補足③その他

僕の運営するサイト『未来地図』では、8人のスタッフが普段アメブロでブログを書いているので、今回の機能について「複数のブログに対応しないといけない」なんて事情がありました。

そのため、実際の実装は、

各スタッフのプロフィールページで「アメブロID」「テーマID」を登録できるようにして、毎日深夜0時になったら全スタッフの登録データを元にアメブロから記事を転送してWordPress側で記事化させる

という仕様にしました。

・・・メチャ便利!

おわりに

以上、全3回にわたってWordPressでアメブロ特定テーマの記事を自動で記事化する機能に挑戦してみました(*´`)

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

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

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

→この記事を読む