【PHP実践|実務向け】PHPでsitemap.xmlを動的生成してSEOを効率化する方法

導入: なぜサイトマップの動的生成が重要か

Webサイトを運営する際、検索エンジンにコンテンツを正しく認識してもらうために「サイトマップ(sitemap.xml)」は不可欠です。しかし、記事を追加するたびに手動でXMLファイルを書き換えるのは現実的ではありません。運用コストを削減し、かつ常に最新の情報を検索エンジンに伝えるために、PHPを使用してデータベースの内容からサイトマップを動的に生成する仕組みを構築しましょう。

基礎知識: サイトマップの構造とPHPのDOMDocument

サイトマップは、ルート要素である「urlset」の中に、個々のページを示す「url」要素が並ぶ階層構造を持っています。PHPでXMLを扱う際、文字列として連結するよりも、標準ライブラリである「DOMDocument」を使用する方が安全かつ確実です。DOMDocumentを使うことで、XMLの構文エラーを防ぎ、正しい形式でノードを組み立てることが可能になります。

実装/解決策: クラスによるカプセル化

サイトマップ生成処理をクラス化することで、コードの再利用性を高めます。データベースから取得したURLリストをループ処理でクラスに渡し、最後にXMLを出力またはファイル保存するという流れが現場での定石です。

サンプルプログラム: SitemapGeneratorクラスの実装

以下に、実用的なSitemapGeneratorクラスと、その利用例を示します。

  • サイトマップ生成クラス
  • /
    class SitemapGenerator {
    private $dom;
    private $urlset;

    public function __construct() {
    // XMLの初期設定
    $this->dom = new DOMDocument(‘1.0’, ‘UTF-8’);
    $this->dom->preserveWhiteSpace = false;
    $this->dom->formatOutput = true;

    // urlset要素の作成
    $this->urlset = $this->dom->appendChild($this->dom->createElement(‘urlset’));
    $this->urlset->setAttribute(‘xmlns’, ‘http://www.sitemaps.org/schemas/sitemap/0.9’);
    }

    /

    • ページ情報を追加
    • @param array $params loc, lastmod, changefreq, priority

    /
    public function add(array $params) {
    $url = $this->urlset->appendChild($this->dom->createElement(‘url’));
    foreach ($params as $key => $value) {
    if (!empty($value)) {
    $url->appendChild($this->dom->createElement($key, $value));
    }
    }
    }

    /

    • XMLを出力またはファイル保存

    /
    public function generate($filePath = null) {
    if ($filePath) {
    return $this->dom->save($filePath);
    }
    header(“Content-Type: text/xml; charset=utf-8”);
    echo $this->dom->saveXML();
    }
    }

    // 利用例
    $sitemap = new SitemapGenerator();

    // データベースから取得したデータと想定
    $pages = [
    [‘loc’ => ‘https://example.com/’, ‘lastmod’ => ‘2023-10-01’, ‘changefreq’ => ‘daily’, ‘priority’ => ‘1.0’],
    [‘loc’ => ‘https://example.com/about’, ‘lastmod’ => date(‘c’), ‘changefreq’ => ‘monthly’, ‘priority’ => ‘0.5’]
    ];

    foreach ($pages as $page) {
    $sitemap->add($page);
    }

    // 出力(ブラウザ表示またはファイル保存)
    $sitemap->generate();
    ?>

    応用・注意点: 現場で役立つ補足

    1. キャッシュの検討
    ページ数が数千件を超える場合、毎回DBにクエリを投げてXMLを生成するとサーバー負荷が高まります。cronを使用して定時(例: 毎日深夜)にファイルを生成し、静的ファイルとして保存する運用を推奨します。

    2. XMLの最大制限
    1つのサイトマップファイルには最大50,000個のURL、かつファイルサイズは50MBまでという制限があります。大規模サイトではサイトマップを分割し、sitemap-index.xmlを作成する必要がある点に注意してください。

    3. エスケープ処理
    DOMDocumentを使用すればURLに含まれる特殊文字(&など)は自動的に適切にエスケープされます。手動でXML文字列を組み立てる実装は避けてください。

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