やりたいこと
はてなブログや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
- 記事の作成日
- 記事1
多次元配列をソートするには**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; ?>