当サイトには広告が含まれております

PHPでWordPressの投稿を取得して使いやすい形にするfunctionを書いてみた

この記事は最終更新日から10年経過しています。内容が古い可能性があります。

WordPressの投稿はURLに /feed を付けると見ることが出来ます。これを他のサイトやプログラムで利用したかったのでPHPで取得して内容を使ってみたいと思います。そのまえに、xmlを整形して使いやすい形にするfunctionを書いてみました。それについて書きます。

記事をざっと見る

feedで表示の確認:表示されているRSSの設定はここでしていました

今このblogの投稿RSSは

https://usortblog.com//feed/

この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 で取得したデータを加工する

上記の方法ですと、コーディングが面倒そうです。

ということで、もうちょっと簡単に使う方法についてググって調べてみました。

RSS(XML)の名前空間やCDATAの値を取得する方法

この記事がとても参考になりました。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の項目名や内容について一覧にして後で使うときにすぐわかるようにしておきたかったのですがとても長くなってしまったので、一覧や具体的にどうやって使うかについてはまた別の投稿で書きたいと思います。

この記事が気に入ったら
いいね または フォローしてね!

あなたのシェアが励みになります!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントを残す

記事をざっと見る