前回の記事では、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 を使えば簡単に実装できる
- 記事更新時にキャッシュ削除すれば、最新状態を保ちながら負荷を下げられる
次回は、「サイトマップを分割して大規模サイトに対応する方法」 について解説予定です。
コメント