WordPress|All in One SEO サイトマップをキャッシュ化して高速化する方法

前回の記事では、All in One SEO(AIOSEO)で条件付きの専用サイトマップを追加する方法 を解説しました。
今回はさらに一歩進んで、サイトマップのキャッシュ化による高速化 について紹介します。


なぜキャッシュが必要なのか?

サイトマップは検索エンジンのクローラーが頻繁にアクセスする重要なファイルです。
通常は get_posts() などで記事を取得して動的にXMLを生成しますが、以下の課題があります。

  • 投稿数が増えると生成処理が重くなる
  • クローラーが短時間に何度もアクセスするとサーバー負荷が上がる
  • 毎回同じ結果を返しているのに無駄な処理が発生する

そこで有効なのが キャッシュ化 です。
一度生成したサイトマップを保存しておき、一定時間はそのまま返す仕組みにすれば、大幅な高速化が可能です。


キャッシュ化の実装方法

1. キャッシュ用のトランジェントを利用

WordPress標準の Transients API を使うとシンプルに実現できます。
以下のコード例では、専用サイトマップをキャッシュ化しています。

<?php
/**
 * キャッシュ付き専用サイトマップ
 */

add_action('template_redirect', function () {
    if (preg_match('#sitemap-company\.xml$#', $_SERVER['REQUEST_URI'])) {
        header('Content-Type: application/xml; charset=UTF-8');

        // キャッシュから取得
        $cache_key = 'sitemap_company_xml';
        $xml = get_transient($cache_key);

        if (false === $xml) {
            // キャッシュなし → 新規生成
            $posts = get_posts([
                'post_type'      => 'company',
                'post_status'    => 'publish',
                'posts_per_page' => -1,
                'orderby'        => 'date',
                'order'          => 'DESC',
            ]);

            ob_start();
            echo '<?xml version="1.0" encoding="UTF-8"?>'; ?>
            <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
                <?php foreach ($posts as $post): ?>
                    <url>
                        <loc><?php echo esc_url(get_permalink($post)); ?></loc>
                        <lastmod><?php echo esc_html(get_post_modified_time('c', true, $post)); ?></lastmod>
                        <changefreq>weekly</changefreq>
                        <priority>0.9</priority>
                    </url>
                <?php endforeach; ?>
            </urlset>
            <?php
            $xml = ob_get_clean();

            // キャッシュ保存(15分間)
            set_transient($cache_key, $xml, 15 * MINUTE_IN_SECONDS);
        }

        echo $xml;
        exit;
    }
});

2. コード解説

  • get_transient() / set_transient()
    WordPress標準のキャッシュ保存機能。MemcachedやRedisが入っている環境では自動的に利用されます。
  • キャッシュキー (sitemap_company_xml)
    複数のサイトマップをキャッシュしたい場合はキーを分けます。
  • 有効期限 (15 * MINUTE_IN_SECONDS)
    15分間キャッシュを保持する例。記事更新頻度に応じて調整可能です。
    更新検知をシビアにする必要があれば5分、緩めてもいいなら1時間以上でもOK。

キャッシュクリアの工夫

記事が公開・更新されたタイミングでキャッシュを削除すれば、最新情報もすぐ反映可能です。

add_action('save_post_company', function () {
    delete_transient('sitemap_company_xml');
});

これにより、専用サイトマップは 「記事更新時は即リフレッシュ」「普段はキャッシュ」 という効率的な動作になります。


まとめ

  • サイトマップはアクセス頻度が高く、キャッシュ化すると大幅な高速化が可能
  • WordPress標準の Transients API を使えば簡単に実装できる
  • 記事更新時にキャッシュ削除すれば、最新状態を保ちながら負荷を下げられる

次回は、「サイトマップを分割して大規模サイトに対応する方法」 について解説予定です。

コメント

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