Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

【PHP】はてなブログやQiitaなど別サービスの記事を一か所にまとめて表示する方法

More than 1 year has passed since last update.

やりたいこと

はてなブログやQiitaなどの別サービスのブログ記事を日付順でまとめて一覧表示する。

※今回は、はてなブログとQiitaと個人で運営しているサイトのブログ記事の三つをまとめて表示。

備考

まとめるブログ
- はてなブログの投稿記事
- Qiitaの投稿記事
- 個人運営のブログ記事(このサイトのトップにまとめた記事を一覧表示する)

環境
- PHP5.6
- CakePHP3.6
- CentOS7

方法

全体像
1.それぞれのブログの記事情報を一つの配列にまとめる
2.配列内の要素を日付順でソートする
3.foreachで配列を回して一件ずつ表示

1.それぞれのブログの記事情報を一つの配列にまとめる

まず、はてなブログ・Qiita・個人ブログの記事情報(タイトル・投稿日とか)を一つの配列の中に入れ込んでいきます。
ここでは、記事情報を詰め込む配列を$listBlogsとしています。

//記事情報を格納する配列を用意
$listBlogs = array();

/**
 * Qiitaに投稿した記事内容を$listBlogsに格納する
 */

//rssフィードの情報を取得する
$qiitaRssUrl = 'https://qiita.com/hogehoge/feed';
$qiitaXmlObject = simplexml_load_file($qiitaRssUrl);
$qiitaBlogs = $qiitaXmlObject -> entry;

//取得したrss情報を基に必要な記事情報を$listBlogsへ格納する
foreach ($qiitaBlogs as $qiitaBlog) {
     $listBlogs[] = array(
          'title' => $qiitaBlog -> title,
          'url' => $qiitaBlog -> url,
          'date' => date('Y-m-d', strtotime($qiitaBlog -> updated))//①日付フォーマットの統一
     );
}

/**
 * はてなブログに投稿した記事内容を$listBlogsに格納する
 */

//rssフィードの情報を取得する
$hatenaRssUrl = 'https://hogehoge.hatenablog.com/rss';
$hatenaXmlObject = simplexml_load_file($hatenaRssUrl);
$hatenaBlogs = $hatenaXmlObject -> channel -> item;

//取得したrss情報を基に必要な記事情報を$listBlogsへ格納する
foreach ($hatenaBlogs as $hatenaBlog) {
     $listBlogs[] = array(
          'title' => $hatenaBlog -> title,
          'url' => $hatenaBlog -> link,
          'date' => date('Y-m-d', strtotime($hatenaBlog -> pubDate))//①日付フォーマットの統一
     );
}

/**
 * 個人ブログに投稿した記事内容を$listBlogsに格納する
 */

$blogs = $this->Hogehoge->find()->all();

foreach ($blogs as $blog) {
        $listBlogs[] = array(
            'title' => $blog -> title,
            'url' => $blog -> url,
            'date' => date('Y-m-d', strtotime($blog -> modified))//①日付フォーマットの統一
        );
}

QiitaとはてなブログについてはRSSフィードのXML情報から記事タイトルや記事作成日を取得しています。
RSSフィードのXML情報を取得するにはsimplexml_load_file()を使用します。
このsimplexml_load_file()はXML情報がオブジェクトとして返ってくるので、それを基に記事タイトルなど必要な情報を抽出し$listBLogsへ記事単位で格納します。

//RSSフィードのXML情報を取得
$rssFeedUrl = 'https://hogehogehoge.hoge'
$rssXmlInfo = simplexml_load_file($rssFeedUrl)

//例:タイトルを取得
$title = $rssXmlInfo -> title;

RSSフィードの取得については以下の記事を参考にしました。
【PHP】 RSSフィードを取得して、ブログの更新情報を表示してみる。

コード内の①の部分はこの後日付順で記事をソートする際にフォーマットがバラバラだと上手くいかないので、フォーマットを統一するための記述です。

日付のフォーマットを変更するには、date()strtotime()を組み合わせて使用しています。
こちらについては以下の記事を参考にしました。
php:phpのdate関数で日付のフォーマット変更

2.配列内の要素を日付順でソートする

1.でそれぞれのサービスの記事情報が記事単位で一つの配列に格納されたので、格納された記事を日付順でソートします。
(ソート前は、Qiita→はてなブログ→個人ブログの順に並んでいます)

/**
 * 配列$listBlogs内の要素を日付順でソート
 */

//配列の各要素からソートの基準となる値のみを抽出し、別の配列に格納する
$date_array = array();

foreach( $listBlogs as $listBlog ) {
     $date_array[] = $listBlog['date'];
}

//ソートの実施
array_multisort( $date_array, SORT_DESC, $listBlogs);

記事の情報が格納された$listBlogsは以下のような構造を持つ多次元配列となっています。

  • $listBlogs
    • 記事1
      • 記事タイトル
      • 記事のURL
      • 記事の作成日
    • 記事2
      • 記事タイトル
      • 記事のURL
      • 記事の作成日
    • 記事3
      • 記事タイトル
      • 記事のURL
      • 記事の作成日

多次元配列をソートするにはarray_multisort()を使用します。
第一引数にソートの基準となる要素が格納された配列(今回の場合は記事の作成日でソート)
第二引数にソートの方式(昇順か降順か)
第三引数にソートしたい配列
をそれぞれ指定していきます。

配列のソートについては以下の記事を参考にしました。
多次元配列のソート:array_multisort関数

3.foreachで配列を回して一件ずつ表示

後は、必要に応じてforeachで$listBLogsを回してあげればOKです。
以下は一例です。記事タイトルに各記事へのaタグを出力したものです。
CakePHP3の書き方に準拠してます。

<?php foreach($listBlogs as $listBlog): ?>
     <a href="<?= $listBLog['url'] ?>"><h2><?= $listBLog['title'] ?></h2></a>

<?php endforeach; ?>

aochan
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away