WordPressの投稿はURLに /feed を付けると見ることが出来ます。これを他のサイトやプログラムで利用したかったのでPHPで取得して内容を使ってみたいと思います。そのまえに、xmlを整形して使いやすい形にするfunctionを書いてみました。それについて書きます。
feedで表示の確認:表示されているRSSの設定はここでしていました
今このblogの投稿RSSは
このURLで表示されます。中を見ると、最新の10件がxmlフィードとなっているようです。また、記事全文も入っています。
この設定は
ダッシュボード 設定>表示設定 の
RSS/Atom フィードで表示する最新の投稿数 と RSS/Atom フィードでの各投稿の表示 で指定した内容になっています。変更したい場合はここで設定を変えることが出来ます。
simplexml_load_file でWordPressのRSSフィードを取得してみた
simplexml_load_file を使ってWordPressのRSSフィードを取得してみました。
$feed = simplexml_load_file("https://usortblog.com//feed/",'SimpleXMLElement',LIBXML_NOCDATA); echo "<pre>";var_dump($feed);echo "</pre>";
このようなコードを書いて実行します。結果は、
object(SimpleXMLElement)#1 (2) { ["@attributes"]=> array(1) { ["version"]=> string(3) "2.0" } ["channel"]=> object(SimpleXMLElement)#2 (7) { ["title"]=> string(9) "RYUS blog" ["link"]=> string(22) "https://usortblog.com/" ["description"]=> string(23) "株式会社RYUSのblog" ["lastBuildDate"]=> string(31) "Mon, 20 Apr 2015 00:30:34 +0000" ["language"]=> string(2) "ja" ["generator"]=> string(29) "http://wordpress.org/?v=4.1.1" ["item"]=> array(10) { [0]=> object(SimpleXMLElement)#3 (7) { ["title"]=> string(91) "simplexml_load_fileでWordPressのRSSを読み込もうとしてエラーになった原因" ["link"]=> string(48) "https://usortblog.com//simplexml_load_fileerror/" ["comments"]=> string(57) "https://usortblog.com//simplexml_load_fileerror/#comments" ["pubDate"]=> string(31) "Mon, 20 Apr 2015 00:30:34 +0000" ["category"]=> array(4) { [0]=> string(3) "php" [1]=> string(9) "WordPress" [2]=> string(6) "全般" [3]=> string(12) "開発言語" } ["guid"]=> string(30) "https://usortblog.com//?p=8501" ["description"]=> string(573) "WordPressのRSSフィードをPHPで読むというプログラムをちょこっと書こうと思って、いきなりつまづきました。なぜかエラーが出てしまい、どのサイトで見つけたコードでも上手く行きません。 しかし、エラーメッセージで探 … 続きを読む simplexml_load_fileでWordPressのRSSを読み込もうとしてエラーになった原因 →" }
こんな感じで、一見「OK~!」と思ったのですが、よく見ると先ほどfeedをブラウザで表示していたいくつかの項目が表示されていません。
<dc:creator><![CDATA[ 兎本 美佳 ]]></dc:creator>
例えばこのような、 <dc:creator> が表示されていないのです。この項目は、名前空間を使っている項目で、最強と思われる var_dump でも表示されないようです。見たい場合は、
foreach($feed->channel->item as $eachItem) { echo "<pre>"; var_dump((string)$eachItem->children('dc', true)->creator); echo "</pre>"; }
このようなコードを書いて表示しないといけません。しかし、、ちょっとこの方法は面倒そうです。
file_get_contents で取得したデータを加工する
上記の方法ですと、コーディングが面倒そうです。
ということで、もうちょっと簡単に使う方法についてググって調べてみました。
この記事がとても参考になりました。simplexml_load_string を使う方法です。
<?php $rss_url = "https://usortblog.com//feed/"; // このblogのfeedのURL $rss_data = file_get_contents($rss_url); $rss_data = preg_replace("/<([^>]+?):(.+?)>/", "<$1_$2>", $rss_data); $rss_data = simplexml_load_string($rss_data,'SimpleXMLElement',LIBXML_NOCDATA); $rss_array = array(); foreach($rss_data->channel->item as $item){ $rss_array[] = $item; } echo "<pre>";var_dump($rss_array);echo "</pre>";
ほぼ丸ごとコピーで、ちょっとだけ修正しました。これで表示すると、
["dc_creator"]=> string(13) "兎本 美佳"
このように名前空間での dc:creator が dc_creator というキーの配列の形になりました。このあとこれらの値を参照するときも楽そうです。
WordPressのRSSフィードを使いやすい形で取得するfunction
今時点では各記事である item 部分が編集されただけで、blogのタイトルなどが変数に入っていません。取得した全ての値をあるていど使いやすい配列の形などにするfunctionを書いてみました。
function getRssFeed($url) { $rss_data = file_get_contents($url); $rss_data = preg_replace("/<([^>]+?):(.+?)>/", "<$1_$2>", $rss_data); $rss_data = simplexml_load_string($rss_data,'SimpleXMLElement',LIBXML_NOCDATA); $rssArray = array(); foreach($rss_data as $channel){ foreach($channel as $key=>$val){ if ($key != 'item') { if ($key != 'atom_link') { $rssArray[$key] = strval($val); } else { $rssArray['atom_link']['href'] = strval($val->attributes()->href); $rssArray['atom_link']['rel'] = strval($val->attributes()->rel); $rssArray['atom_link']['type'] = strval($val->attributes()->type); } } } } $itemArray = array(); foreach($rss_data->channel->item as $item){ $itemArray[] = $item; } $rssArray['item'] = $itemArray; return $rssArray; }
このfunctionを呼び出して、取得した値を表示するプログラム部分を
$rss_url = "https://usortblog.com//feed/"; // このblogのfeedのURL $rssFeed = getRssFeed($rss_url); echo "<pre>";var_dump($rssFeed);echo "</pre>";
このように書いて実行すると、
array(10) { ["title"]=> string(9) "RYUS blog" ["atom_link"]=> array(3) { ["href"]=> string(28) "https://usortblog.com//feed/" ["rel"]=> string(4) "self" ["type"]=> string(19) "application/rss+xml" } ["link"]=> string(22) "https://usortblog.com/" ["description"]=> string(23) "株式会社RYUSのblog" ["lastBuildDate"]=> string(31) "Mon, 20 Apr 2015 00:30:34 +0000" ["language"]=> string(2) "ja" ["sy_updatePeriod"]=> string(6) "hourly" ["sy_updateFrequency"]=> string(1) "1" ["generator"]=> string(29) "http://wordpress.org/?v=4.1.1" ["item"]=> array(10) { [0]=> object(SimpleXMLElement)#4 (11) { ["title"]=> string(91) "simplexml_load_fileでWordPressのRSSを読み込もうとしてエラーになった原因" ["link"]=> string(48) "https://usortblog.com//simplexml_load_fileerror/" ["comments"]=> string(57) "https://usortblog.com//simplexml_load_fileerror/#comments" ["pubDate"]=> string(31) "Mon, 20 Apr 2015 00:30:34 +0000" ["dc_creator"]=> string(13) "兎本 美佳" ["category"]=> array(4) { [0]=> string(3) "php" [1]=> string(9) "WordPress" [2]=> string(6) "全般" [3]=> string(12) "開発言語" } ["guid"]=> string(30) "https://usortblog.com//?p=8501" ["description"]=> string(573) "WordPressのRSSフィードをPHPで読むというプログラムをちょこっと書こうと思って、いきなりつまづきました。なぜかエラーが出てしまい、どのサイトで見つけたコードでも上手く行きません。 しかし、エラーメッセージで探 … 続きを読む simplexml_load_fileでWordPressのRSSを読み込もうとしてエラーになった原因 →" ["content_encoded"]=> string(6649) "
このように扱いやすい感じの配列になりました。
使い方としては、例えば
$string = 'ブログの名前:%s<br /><a href="%s">rssフィード</a>'; echo sprintf($string, $rssFeed['title'], $rssFeed['atom_link']['href']);
このようにすれば、
こんな風に表示することができます。
まとめ:項目の内容については別途一覧にしたいと思います
本当はもっと早く扱いやすい形にできるはずだったのですが、色々あって思わず長いblogになってしまいました。
自分的にxmlの項目名や内容について一覧にして後で使うときにすぐわかるようにしておきたかったのですがとても長くなってしまったので、一覧や具体的にどうやって使うかについてはまた別の投稿で書きたいと思います。
コメント