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

この記事は約12分で読めます。

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

スポンサーリンク

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

今このblogの投稿RSSは

ゆうそうとITブログ

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

兎本美佳

ブログを見た人がそのままできたらいいなと思って、できるだけ丁寧に書いています。blogに書いたようなネタの有償対応のご相談は「ゆうそうと」へいただければと思います(^^)/
無償での対応をご希望の場合は、コメントをいただけましたら可能な場合はコメントを返させていただきます。

ゆうそうとITブログの更新通知が受け取れます!
スポンサー広告

WordPress RSS 全般 php プラグイン 開発言語 xml
スポンサーリンク
ゆうそうとITブログの更新通知が受け取れます!
ゆうそうとITブログ

コメント

トップへ戻る

ゆうそうとについての説明

ゆうそうと とは東京都八王子市を中心として、WordPressによるWEBサイトの作成や、スポットでのIT相談を行ったり、年間契約でのIT顧問をなりわいとして活動しています。

特徴としては30年以上IT業界でプログラムを中心として仕事をしてきたものと、美大出身のデザイナーがワンストップで対応するため、幅広い対応が可能であることです。

IT相談は直接お会いしてのご相談の他、ZOOMによるオンライン相談も可能です。