自分で自分のサイトの記事ページ(URL)一覧を取得したいとき、どうすれば一番楽でしょう。サイトが WordPress なら、データベースにクエリを投げるのも良いですが、もう少し汎用的で、もう少し楽な方法を考えました。そうだ、サイトマップ(xml)って まさしくページ URL の一覧ではないですか。
この記事は、WordPress で縁のある PHP を使って、自サイトの記事ページ URL 一覧を取得する方法をメモしています。
サイトマップ(xml)の構造
これは実際に見てみるのが早いですね。当サイトのサイトマップは WordPress SEO by Yoast プラグインで生成していますが、フォーマットは世界標準です。記事(post)のサイトマップは以下のような感じです。
sitemap.xml(抜粋)
<urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url> <loc>http://designhack.slashlab.net</loc> <lastmod>2014-11-03T05:52:43+09:00</lastmod> <changefreq>daily</changefreq> <priority>1</priority> </url> <url> <loc>http://designhack.slashlab.net/netbeans-8-fonts-windows7/</loc> <lastmod>2014-07-07T14:52:14+09:00</lastmod> <changefreq>weekly</changefreq> <priority>0.6</priority> <image:image> <image:loc>http://designhack.slashlab.net/images/eyecatch_01.jpg</image:loc> <image:caption><![CDATA[NetBeans 8.0 のフォント設定 [Windows 7]]]></image:caption> </image:image> </url> <url> <loc>http://designhack.slashlab.net/how-to-fix-wordpress-seo-yoast-sitemap-404-error/</loc> <lastmod>2014-07-14T11:48:02+09:00</lastmod> <changefreq>weekly</changefreq> <priority>0.6</priority> <image:image> <image:loc>http://designhack.slashlab.net/images/eyecatch_02.jpg</image:loc> <image:caption><![CDATA[WordPress SEO by Yoast サイトマップの 404 エラーへの対処方法]]></image:caption> </image:image> <image:image> <image:loc>http://designhack.slashlab.net/images/ScreenShot_02-02-720x117.jpg</image:loc> <image:caption><![CDATA[ScreenShot]]></image:caption> </image:image> </url> <url> ...
タグの階層としては、urlset タグの中の url タグの中の loc タグが目的の URL です。これを一覧にしましょう。
xml サイトマップの詳細な仕様は sitemaps.org の以下ページをご参照ください。
PHP で xml ファイルを読み込む(パースする)
特定のフォーマット(構文)のデータをプログラムで解析するとき、専門用語ではパースする、パースしてくれるプログラムをパーサー(parser)なんて呼んだりします。PHP で xml をパースする方法を探しました。すぐ見つかりました。
simplexml_load_file() 関数を使えば一発のようです。すごい。便利。ただ、取得できるのは SimpleXMLElement クラスのオブジェクト型らしいので、併せて get_object_vars() 関数も使って文字列データに変換して連想配列に格納してみたいと思います。
PHP コード
$sitemap = simplexml_load_file( 'http://designhack.slashlab.net/post-sitemap.xml' ); $urls = array(); foreach ( $sitemap->url as $url ) { $urls[] = get_object_vars( $url ); }
get_object_vars() はオブジェクトの 1階層のみ配列に変換するため、foreach で回して多次元の連想配列にしています。
これを実行すると、$urls は以下になります。
実行結果
Array ( [0] => Array ( [loc] => http://designhack.slashlab.net [lastmod] => 2014-11-03T06:23:18+09:00 [changefreq] => daily [priority] => 1 ) [1] => Array ( [loc] => http://designhack.slashlab.net/netbeans-8-fonts-windows7/ [lastmod] => 2014-07-07T14:52:14+09:00 [changefreq] => weekly [priority] => 0.6 ) [2] => Array ( [loc] => http://designhack.slashlab.net/how-to-fix-wordpress-seo-yoast-sitemap-404-error/ [lastmod] => 2014-07-14T11:48:02+09:00 [changefreq] => weekly [priority] => 0.6 ) ...
ほらできた。簡単!
あとは $urls を foreach で回せば、一覧にするなり、煮るなり焼くなり好きにできますね。
一覧を出力する PHP コード
foreach ( $urls as $url ) { echo $url['loc']; }
参考サイト
- php:XMLファイルのデータを取得し、配列に変換する | raining
- simplexmlでパースした場合は文字列にキャストした方がいい – Kill one bird with two stones.
- 自作RSSリーダも簡単に作れる、simplexml_load_file()が便利すぎる
- PHP: 基本的な SimpleXML の使用法 – Manual
始まりの終わり
実はこの記事、自サイトの動画サイトマップを生成するプロジェクトの序章です。続きはウェブで!
すでにウェブでした。たぶん来週とその次くらいで完結すると思います。頑張れ自分。