更新履歴をRSSリーダーにした

個人サイトの更新履歴を、phpでRSS読むかたちにした話。
プログラムを学んだこともない、ズブの素人がワーワー言いながらやりました。
たぶん、もっとスマートなやり方があります。
備忘録を兼ねて。

2024/2/8 読み返したら不親切だったので、ちょこっと追記しました。
少しは親切になったんじゃないかと……。


経緯

個人サイトで、おえかきの更新をラクにしたかった。

じゃあ、いつも通り日記CGIに投げるだけで更新扱いにできれば=勝手におえかき一覧として展示できる&更新履歴に乗ればいいんじゃない?

準備

サイトでは日記CGIとしててがろぐを使用している。
おえかき一覧としての表示はテンプレートをいじった。
更新履歴用に、てがろぐはカテゴリごとにもRSSフィードがつくれる仕様なので、それを利用。

その他の小説やサイト全体のお知らせは手動でやったほうが取捨選択がラクなので、PKOBO-News01を導入。
RSSの発信もできるのと、てがろぐの分は残らないがそれ以外の履歴は残せるので、残す用の更新履歴として。
履歴を残したいのは、どれをいつ更新したっけ?を後から参照したいから。てがろぐ投稿分はどのみちタイムスタンプが残るので、まあいいかなと。

<2024/2/8追記>
運用しながら、覚え書きしておきたいがトップには出したくない履歴を残したくなったので利用法を変更。
PKOBO-News01はRSSの発信専用にして、てがろぐ内に更新履歴カテゴリをつくってそこへ残したい履歴と覚え書きを書いていくことにしている。

てがろぐで完結したら良かったけど、カテゴリで分けてRSSを出力しても、トップに出る履歴はてがろぐ記事へのリンクになってしまう。作品へ飛びたいのに、お知らせ記事を挟んで飛ぶ羽目になるのは気分が下がる。読まないでタスキルする可能性が高い。
ので、作品への直接リンク生成用にPKOBO-News01を使わせていただいて、ついでにトップに出したい情報と出さなくていい情報の使い分けにもしている。

どのみち、トップに履歴書いて、履歴ページにも書いて、てがろぐにも残して……ってやってたので、手間としてはあんまり変わらない。
文章書くのは好きなので。画像のアップロードとhtmlに画像埋め込むのが面倒なだけです。
ややこしいので、実際に見るのが一番はやいかも。おいときます。
</2024/2/8追記>

本題

RSSフィードは揃ったので、複数のRSSを読み込んでhtmlに表示する方法。
ググって出てきたやつ、どれも素直に動いてくれなかった or 期待した動作をしなかったので、いろいろやりました💪

使うライブラリを用意する

「Google Feed API」の代替として「rss-php」でRSSやAtomフィードを取得・表示する – lesson me
に手順があります。
『Feed.php』だけ使います。上記記事のとおり、任意の場所に置いてください。

ヘッダより先に埋め込む用php

body内に書いてもいける。
書いてあるファイル自体がphpじゃないと動かないです。

<?php 
// ライブラリの読み込み 
require_once ($_SERVER['DOCUMENT_ROOT'] . '/Feed.php'); 
// キャッシュの設定 
Feed::$cacheDir = $_SERVER['DOCUMENT_ROOT'] . '/tmp'; 
Feed::$cacheExpire = '1 hours';
 
$url1 = "RSSのアドレス1"; 
$url2 = "RSSのアドレス2";
$url3 = "RSSのアドレス3"; 
 
$rss1 = simplexml_load_file($url1);
$rss2 = simplexml_load_file($url2); 
$rss3 = simplexml_load_file($url3);
 
$entrylist = array(); 
$title = array(); 
$date = array(); 
$link = array(); 
$i = 0;
 
foreach($rss1->channel->item as $item){ 
$title = $item->title; 
$date = date("y/m/d", strtotime($item->pubDate)); 
$link = $item->link; 
// 配列に 
$entrylist[$i]["title"]= $title; 
$entrylist[$i]["link"] = $link; 
$entrylist[$i]["date"] = $date; 
//$iを1増やして次のループへ 
$i++; 
}
 
foreach($rss2->channel->item as $item){ 
$title = $item->title; 
$date = date("y/m/d", strtotime($item->pubDate)); 
$link = $item->link; 
// 配列に 
$entrylist[$i]["title"] = $title; 
$entrylist[$i]["link"] = $link; 
$entrylist[$i]["date"] = $date; 
//$iを1増やして次のループへ 
$i++; 
}
 
foreach($rss3->channel->item as $item){ 
$title = $item->title; 
$date = date("y/m/d", strtotime($item->pubDate)); 
$link = $item->link; 
// 配列に 
$entrylist[$i]["title"]= $title; 
$entrylist[$i]["link"] = $link; 
$entrylist[$i]["date"] = $date; 
//$iを1増やして次のループへ 
$i++; 
}
 
$html = '';
 
// 日付でソート 
foreach ((array)$entrylist as $key => $value) { 
$sort[$key] = $value["date"]; 
} 
array_multisort($sort, SORT_DESC, $entrylist); 
 
for ($i=0; $i <6; $i++){ 
$html .= '<dt>' . $entrylist[$i]["date"]  . '</dt><dd><a href="' . $entrylist[$i]["link"] . '">' . $entrylist[$i]["title"] . '</a></dd>' ; 
}
?>

Feed.phpの場所はご自身で置いた場所を指定してください。

//ライブラリの読み込み
require_once ($_SERVER['DOCUMENT_ROOT'] . '/Feed.php');

この部分のコード見たらわかると思うんですが、相対パスの記述ではないです。
太字の部分はそのサーバのルートディレクトリを指しているので、そこから続けて場所を指定してください。
変えるのは『/Feed.php』の部分。『'』(シングルクォーテーション)で囲むのを忘れるとエラーになります。

// キャッシュの設定
Feed::$cacheDir = $_SERVER['DOCUMENT_ROOT'] . '/tmp';

ここも同様です。これは私が借りているさくらのサーバに合わせている(はず)なので、必要に合わせて変えてください。
私も実はできてないのかもしれないですけど、動くからいいやの精神。

html内のほしいところに置く用のコード

<dl>
<?php echo $html ?>
</dl>

参考にしたり、使わせていただいたコード

⚫︎「Google Feed API」の代替として「rss-php」でRSSやAtomフィードを取得・表示する – lesson me
Feed.phpへの相対パスもだけど、キャッシュのフォルダはサーバで違うっぽいので、さくらのレンタルサーバに合わせて変えました。
あとは取り出した要素を多次元配列にするのと、日付のソートはここのを使わせていただいてます。

⚫︎PHPで複数のRSSをまとめて、更新時間順で並べて表示したい | Pink Panda
複数RSSの処理はここを参考にしました。
上の記事のやつでやれたらスマートだったんだけど、ポンコツ脳では処理が理解しきれなかったので……。
ただ、これだと日付がソートできなかったので、このコードまるっとは使えませんでした。

⚫︎【PHP】foreach内でループ回数を数えるカウンターを作る方法
取り出した要素を配列にしたものの、$iが進まないので延々上書きされていくのを止めてくれた救世主。

補足

タイトルとかに毎回必ず付け足したいものがあるとき

RSSごとにしか指定できないですが、
この部分に

// 配列に
$entrylist[$i]["title"]= 'note|'.$title;
$entrylist[$i]["link"] = $link.'&mode=gallary';
$entrylist[$i]["date"] = '日付:'.$date;]

こう。(太字部分)

途中に挟むことはできないけど、前後にだったらつけられます。
こちらも、『'』(シングルクォーテーション)で囲むの忘れるとエラーになります。
入れる文字列によってはエラーになるので、構文チェッカーなどで確認するのをお勧めします。

表示件数を変えたいとき

for ($i=0; $i <6; $i++){
$html .= '<dt>' . $entrylist[$i]["date"] . '</dt><dd><a href="' . $entrylist[$i]["link"] . '">' . $entrylist[$i]["title"] . '</a></dd>' ;
}

ここの数字(太字)を変えればいけます。
RSSで配信されてる件数より少ないと、たぶんバグる。

htmlの表示を変えたいとき

処理部分のここ(太字)

for ($i=0; $i <6; $i++){
$html .= '<dt>' . $entrylist[$i]["date"] . '</dt><dd><a href="' . $entrylist[$i]["link"] . '">' . $entrylist[$i]["title"] . '</a></dd>' ;
}

それから表示部分のここ(太字)

<dl>
<?php echo $html ?>
</dl>

をお好みな感じでどうぞ。


この記事が気に入ったらサポートをしてみませんか?