サイトマップ(xml)からページの URL 一覧を取得する方法(PHP)

November 4, 2014

自分で自分のサイトの記事ページ(URL)一覧を取得したいとき、どうすれば一番楽でしょう。サイトが WordPress なら、データベースにクエリを投げるのも良いですが、もう少し汎用的で、もう少し楽な方法を考えました。そうだ、サイトマップ(xml)って まさしくページ URL の一覧ではないですか。

Get All URLs from sitemap.xml

この記事は、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'];
}

参考サイト

始まりの終わり

実はこの記事、自サイトの動画サイトマップを生成するプロジェクトの序章です。続きはウェブで!

すでにウェブでした。たぶん来週とその次くらいで完結すると思います。頑張れ自分。

コメントを残す

メールアドレスが公開されることはありません。