【PHP実践|実務向け】プラグインに頼らない!WordPressサイトマップの動的生成手法

導入

WordPressサイトにおいて、サイトマップ(sitemap.xml)の生成はSEO対策の基本です。一般的には「Yoast SEO」や「XML Sitemap & Google News」などのプラグインを利用しますが、大規模なメディアサイトや、独自のディレクトリ構造を持つ特殊な環境では、プラグインの仕様が足かせになることがあります。本記事では、WordPressのコア機能を直接活用し、要件に合わせて柔軟にサイトマップを動的生成する方法を解説します。

基礎知識

WordPressには「wp-load.php」という重要なファイルが存在します。これを外部スクリプトから読み込むことで、WordPressの関数(get_postsやhome_urlなど)を外部から利用可能になります。これにより、WordPressのデータベースから直接記事情報を取得し、独自のロジックでXMLを構築することが可能になります。サイトマップ生成の際は、検索エンジンが正しく読み取れるよう、XML形式(Sitemap Protocol)に準拠させる必要があります。

実装/解決策

実装の肝は、WordPressのクエリ関数を用いて必要な記事情報を取得し、それをXMLフォーマットに変換するプロセスです。パフォーマンスを考慮し、大規模サイトの場合は毎回動的に生成するのではなく、cronやファイルの保存処理を組み合わせて「キャッシュ化」する設計が現場では推奨されます。

サンプルプログラム

以下は、WordPressの投稿情報を取得し、サイトマップを出力するための基本的なPHPコードです。

-1, // 全件取得(件数が多い場合はループ処理での分割が必要)
‘post_type’ => [‘post’, ‘page’],
‘post_status’ => ‘publish’,
];

// ホームページの情報を追加
$home = [
‘loc’ => home_url(),
‘last_mod’ => (new DateTime(get_lastpostmodified()))->format(‘c’),
‘changefreq’ => ‘daily’,
‘priority’ => 1.0
];
$sitemap->add($home);

// 記事データをループして追加
$posts = get_posts($args);
foreach ($posts as $post) {
$param = [
‘loc’ => get_permalink($post->ID),
‘lastmod’ => (new DateTime($post->post_modified))->format(‘c’),
‘changefreq’ => ‘monthly’,
‘priority’ => 0.5
];
$sitemap->add($param);
}

// XMLヘッダーを出力してレンダリング
header(‘Content-Type: application/xml; charset=utf-8’);
$sitemap->generate();
exit;
?>

応用・注意点

1. 負荷対策: 記事数が数千件を超える場合、毎回SQLを発行するとサーバー負荷が急増します。その際は「generate(‘sitemap.xml’)」のようにファイルへ書き出し、一定時間ごとに更新する仕組みを取り入れてください。
2. セキュリティ: 外部公開するPHPファイルは、WordPressの権限管理外になることが多いため、ディレクトリへのアクセス制限をかけるなど、セキュリティ対策を怠らないようにしましょう。
3. クロール制限: サイトマップのサイズが大きくなりすぎないよう、必要に応じて複数のファイルに分割し、インデックスファイル(sitemap-index.xml)を作成することも検討してください。

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