はじめに
ちらっとteratailを覗いたら、それ欲しいかもな質問がされていたので、Wordpressのページの一覧を取得するツールを作成してみました。
といっても、Google XML Sitemapsで作成されるsitemap.xmlから取得しているので本当に全部かは、プラグインの設定にも影響されそうです。
追記:Google XML Sitemapsプラグインの「Sitemap コンテンツ」の設定により得られる結果がことなります。
コード
<?php
function get_page_list($sitemap_url, &$urls = null) {
$sitemap = simplexml_load_file( $sitemap_url );
if ($urls === null) {
$urls = array();
}
foreach ( $sitemap->sitemap as $url ) {
$url = get_object_vars( $url )['loc'];
get_page_list( $url, $urls );
}
foreach ( $sitemap->url as $page ) {
$page_info = get_object_vars( $page );
$urls[] = urldecode( $page_info['loc'] );
}
return $urls;
}
# 調べたいサイトのsitemap.xmlを指定します
$urls = get_page_list( 'http://example.com/sitemap.xml' );
foreach ( $urls as $url ) {
echo $url . PHP_EOL;
}
※ エラー処理は省略しています
説明
simplexml_load_file()
により、XMLファイルをパースし、オブジェクトに代入します。
sitemap.xmlには、下位の階層のsitemapと、ページのurlが別々の配列プロパティとして存在しています。なので、sitemapファイルのリストは再帰処理で読み込み、ページのURIのリストは結果配列$urls
へ追加していきます。
呼び出し元で配列を用意するのも面倒なので、オプションでnullを設定して最初の呼び出しで配列が渡されなければ新規作成するようにしています。
注意するのはページのurlがurlエンコードされているので、そのままでは日本語などが“%ほにゃほにゃ”で読めません。なので、urldecode()
を使ってデーコドします。
実行
このサイトで実行した結果です。
ringo@stupiddog ~ $ php getpagelist.php
https://stupiddog.jp/note/
https://stupiddog.jp/note/sitemap.html
https://stupiddog.jp/note/archives/category/作業効率化/コマンドツール
https://stupiddog.jp/note/archives/category/プログラミング
https://stupiddog.jp/note/archives/category/作業効率化
...省略
行数でカウントする限り、一覧が取得出来てそう。
まとめ
あまり大きなサイトで実行すると結果が出るまで遅いですが、なかなか利用できそうな道具が出来ました。
Google XML Sitemapsのプラグインが内部でsitemapを作成している処理を追えば、独自に処理が作れそうですが、データベースへのアクセスが必要なので条件が厳しいです。
再帰でsitemapを潜る以外はPHPが提供する関数のみで作成できるので楽です。 PHP君なかなか使えるのです。