検索エンジンにウェブページの存在を知らせるためにXML形式のサイトマップを作るのは一般的ですが、サイトを更新するたびにサイトマップを手書きするのは大変です。
そこで PHP を使って sitemap.xml を作成するためのクラスを作ってみることにしました。
・sitemap_generator.php
<?php
class SitemapGenerator{
private $sitemap;
private $urlset = array();
function __construct(){
$this->sitemap = new DOMDocument('1.0', 'UTF-8');
$this->sitemap->preserveWhiteSpace = false;
$this->sitemap->formatOutput = true;
$this->urlset = $this->sitemap->appendChild( $this->sitemap->createElement("urlset") );
$this->urlset->setAttribute('xmlns', 'http://www.sitemaps.org/schemas/sitemap/0.9');
}
function add($params){
$url = $this->urlset->appendChild( $this->sitemap->createElement('url') );
foreach($params as $key => $value){
if(strlen($value)){
$url->appendChild( $this->sitemap->createElement($key, $value) );
}
}
}
function generate($file=null){
if( is_null($file) ) {
header("Content-Type: text/xml; charset=utf-8");
echo $this->sitemap->saveXML();
} else {
$this->sitemap->save( $file );
}
}
}
使用例
<?php
include_once "sitemap_generator.php";
$sitemap = new SitemapGenerator();
$sitemap->add([
'loc' => 'https://php-archive.net/',
'lastmod' => '2013-05-23',
'changefreq' => 'daily',
'priority' => '1.0'
]);
$sitemap->add([
'loc' => 'https://php-archive.net/category/php/',
'lastmod' => date('c'),
'changefreq' => 'monthly',
'priority' => '0.5'
]);
$sitemap->generate();
・実行結果
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://php-archive.net/</loc>
<lastmod>2013-05-23</lastmod>
<changefreq>daily</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>https://php-archive.net/category/php/</loc>
<lastmod>2013-05-23T09:01:58+02:00</lastmod>
<changefreq>monthly</changefreq>
<priority>0.5</priority>
</url>
</urlset>
ページごとの url 要素を配列として add() に渡すと追加されます。
generate() で XML として表示されます。
また、generate() の引数にファイルパスを渡せばファイルとして保存されます。
WordPress の記事を元にサイトマップを独自生成する方法 も公開しました。
興味のある方はそちらもご覧ください。
サイトマップの構造
サイトマップは個々のページの情報を記した複数の「url」要素と、それらを束ねる「urlset」要素でできています。
<urlset> <url> ~ </url> <url> ~ </url> <url> ~ </url> </urlset>
「url」要素内には、
・loc (ページのURL)
・lastmod (最終更新日)
・changefreq (更新頻度)
・priority (優先度)
などの要素があり、「loc」以外は必須ではありません。
更新日は「YYYY-MM-DD」で表すか、W3C Datetime 形式(ISO 8601)で表します。
PHP 5 以上であれば date(“c”) を使えば簡単に得られます。
更新頻度は次の値を使うことができます。
“always”, “hourly”, “daily”, “weekly”, “monthly”, “yearly”, “never”
「always」はアクセスする度に変化のあるページで、「never」は更新されることのないページです。
更新頻度はあくまで参考程度のものであり、ここで「hourly」を指定したからといって検索エンジンのクローラーが一時間おきにチェックしに来てくれるとは限りません。
「priority」は優先度に合わせて 0.0 ~ 1.0 の数値で指定します。
デフォルトは 0.5 で、優先度の高いものを大きな数値で表します。
これは相対的なものであり、全てのページに 1.0 を指定しても「全て同じ優先度」であることを意味するだけで、「1.0 = 重要なページ」であることを意味するわけではありません。
サイトマップ構造の詳細については下記URLを御覧下さい
http://www.sitemaps.org/ja/protocol.html