PHPでWordPressの記事データ(XML)を読み込むサンプル
前回の記事「PHPでWordPressの投稿データをsqliteへエクスポートする」ではPHPを使ってWordPressの記事データであるwp_postsテーブルを直接読み、sqliteへ出力するコードを書きました。
でも、もしかしたらWordPressでエクスポートしたXMLから読み込む例も欲しい人がいるかも知れないと感じたので、今回はXMLから記事データを読み込むサンプルを書いてみました。
ほら、WordPressの標準機能で記事をエクスポートしてバックアップは取っていたけれど、何らかの事情でMySQLデータベースへはアクセスできない、あるいはDBが壊れてしまった、なんてケースがあるかもですし。
PHPでWordPressのXMLを読み込む例
サンプルコード
<?php
$xml = simplexml_load_file('WordPress.2019-04-25.xml');
foreach ($xml->channel->item as $data) {
$timestamp = strtotime($data->pubDate);
echo $data->link;
echo $data->title;
echo $data->pubDate;
echo date('Y/m/d H:i:s', $timestamp);
echo '<br>';
}
?>
解説
何のことはなく、simplexml_load_file関数でWordPressのXMLを読み込み、channel->item以下をforeachでループして取得しているだけです。
少し工夫した点としては、記事の投稿日がpubDateに入ってくるのですが、その表記が Tue, 16 Oct 2018 22:10:10 +0000 といった「曜日、日、月、年、時、分、秒」のいわゆるイギリス式の日付表記になっているため、strtotime関数でシリアル値に変換し、表示する際にdate関数で好きな表記(今回の例ではY/m/d H:i:s)に変換しているくらいです。
ただ、このサンプルだとURL、タイトル、投稿日は取得できても、本文が取得できないんですよね。WordPressのXMLを開けばわかりますが、<content:encoded>というタグに本文が入っているため、これをPHPで読み取るにはもうひと工夫必要です。
PHPでWordPressのXMLを読み込む例(content対応)
サンプルコード
<?php
$xml = simplexml_load_file('WordPress.2019-04-25.xml');
foreach ($xml->channel->item as $data) {
$timestamp = strtotime($data->pubDate);
$content = $data->children('http://purl.org/rss/1.0/modules/content/');
echo $data->link;
echo $data->title;
echo $content->encoded;
echo $data->pubDate;
echo date('Y/m/d H:i:s', $timestamp);
echo '<br>';
}
?>
解説
もうひと工夫と言ってもchildrenメソッドを使うだけです。
↓この部分ね。
$content = $data->children('http://purl.org/rss/1.0/modules/content/');
これはWordPressに限らず、PHPでXMLの名前空間付きタグ(<content:encoded>のようにコロンで区切られているタグ)を取得する際には必ず使う手法です。なので、PHPでRSSリーダーを作る際などもchildrenを使って変換します。
childrenで$contentに<content>の構造が入るため、後は$content->encodedで中身を取り出すだけ。
尚、WordPressの記事本文が入っているため、当然HTMLタグが含まれるでしょう。それをそのまま取得するのか、htmlentities関数でHTMLエンティティ化するかは要件次第。
WordPressのXMLから記事データを読み取ってCSVや、ほかのデータベースへインポートするなら無加工で良いでしょうし、Web上に表示したいということであればエンティティ化が必要でしょう。
HTMLエンティティ化する例
echo htmlentities($content->encoded);
まとめ
- WordPressで出力したXMLを読み込むのはsimplexml_load_file関数ひとつでOK
- 英式日付の変換にはstrtotime関数が便利
- 名前空間付きタグ(コロンが付いてるヤツ)を読むにはchildren関数が必要
といったところでしょうか。
PHP5でsimplexml_load_file関数が実装されてからというもの、XMLを読み込むのはらくちんになりましたね。
ただ、「PHPでWordPressの投稿データをsqliteへエクスポートする」で書いたとおり、WordPressでエクスポートできる記事データ(XML)中には記事の投稿日はあるのに最終更新日がありません。
なので、それが必要な場合はやっぱりMySQLへ直接アクセスして読み取るしかないかなぁ…と思います。