【PHP実践|実務向け】PHPで動的サイトマップを生成・自動化する方法

導入

SEO対策において、検索エンジンにサイト構造を正確に伝える「sitemap.xml」は不可欠です。しかし、ページ数が増えるたびに手動でXMLを書き換えるのは非効率であり、更新漏れのリスクも伴います。今回は、PHPのDOMDocumentクラスを活用し、サイトマップを動的に生成・保存するスマートな手法を解説します。

基礎知識

sitemap.xmlは、検索エンジン向けのXMLファイルです。主に以下の要素で構成されます。
loc: ページのURL(必須)
lastmod: 最終更新日
changefreq: 更新頻度
priority: サイト内での優先度(0.0〜1.0)

これらをPHPで構築する際、文字列連結ではなく「DOMDocument」を用いるのが推奨されます。DOMDocumentを使うことで、XMLの構造をオブジェクト指向的に扱えるため、タグの閉じ忘れやエスケープ処理のミスを劇的に減らすことができます。

実装/解決策

XML構築のロジックをクラス化し、汎用性を高めます。コンストラクタでXMLの宣言とルート要素(urlset)を作成し、addメソッドで個々のURLを追加していく設計にすることで、複雑なサイト構造でも柔軟に対応可能です。

サンプルプログラム

以下のクラス定義と使用例を参考にしてください。

sitemap = new DOMDocument(‘1.0’, ‘UTF-8’);
$this->sitemap->preserveWhiteSpace = false;
$this->sitemap->formatOutput = true;

// ルート要素 urlset の作成と名前空間の設定
$this->urlset = $this->sitemap->appendChild($this->sitemap->createElement(“urlset”));
$this->urlset->setAttribute(‘xmlns’, ‘http://www.sitemaps.org/schemas/sitemap/0.9’);
}

// URL情報を追加するメソッド
function add($params) {
$url = $this->urlset->appendChild($this->sitemap->createElement(‘url’));
foreach ($params as $key => $value) {
if (!empty($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);
}
}
}

// — 使用例 —
$sitemap = new SitemapGenerator();
$sitemap->add([
‘loc’ => ‘https://example.com/’,
‘lastmod’ => date(‘Y-m-d’),
‘changefreq’ => ‘daily’,
‘priority’ => ‘1.0’
]);

// ファイルとして保存(例: Cronで定期実行する場合など)
$sitemap->generate(‘sitemap.xml’);
?>

応用・注意点

1. ファイルサイズ制限への対応
サイトマップには「最大50,000URLまで」「ファイルサイズ最大50MB」という制限があります。大規模サイトの場合は、複数のファイルを生成する「サイトマップインデックスファイル」の作成を検討してください。

2. パフォーマンスの最適化
数万件のページがある場合、毎回全てのページを走査してXMLを生成するとサーバー負荷が高まります。データベースの更新タイミングで実行するか、あるいはキャッシュファイルとして保存し、定期的にバックグラウンド(Cron)で更新する構成が現場では一般的です。

3. 文字列エスケープ
DOMDocumentを使用すれば、特殊文字(&など)は自動的にエスケープされるため、セキュリティ面でも安全です。手動で文字列結合を行わないよう注意しましょう。

タイトルとURLをコピーしました