【PHP実践|実務向け】PHP Archiveで実現するWordPressサイトマップの柔軟なカスタマイズ術

1. 導入

WordPressサイトにおいて、サイトマップ(sitemap.xml)はSEOの基本です。通常はプラグインで生成しますが、要件が複雑になると「特定のカテゴリを除外したい」「独自ドメインのサブディレクトリ構成に合わせたい」「サイトマップの出力階層を制御したい」といった課題が発生します。PHPで直接サイトマップ生成ロジックを組むことで、これらのプラグインの制約を突破し、サイト構造に最適なXMLを柔軟に出力することが可能になります。

2. 基礎知識

WordPressにはwp-load.phpというファイルが存在します。これを読み込むことで、WordPressの外部からでもWPの強力な関数(get_postsやhome_urlなど)を呼び出すことができます。本手法では、このwp-load.phpを起点に、WordPressのデータをPHPで取得・加工し、XMLとして出力します。この際、XMLの構造が正しく記述されていることが検索エンジンのインデックス登録には不可欠です。

3. 実装/解決策

実装の肝は「WordPressのクエリをコントロールすること」と「XMLフォーマットの生成」の分離です。
まず、WordPressの投稿データを取得するためのクエリ配列を作成し、それをループ処理でXML生成クラス(SitemapGenerator)に渡します。最後にXMLファイルを生成する際、アクセス頻度が高い場合は、リクエスト毎にXMLを生成するのではなく、cronやファイル保存を用いて「キャッシュ」させる設計が、サーバー負荷軽減の観点から推奨されます。

4. サンプルプログラム

以下は、WordPressのデータを取得してサイトマップを生成する基本的な実装例です。

-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を出力またはファイルへ保存
// 負荷が高い場合は引数にパスを指定してファイル化することを推奨
$sitemap->generate();
exit;
?>

5. 応用・注意点

現場で運用する際に注意すべき点がいくつかあります。
一つ目はサーバー負荷です。記事数が多いサイトで毎リクエストごとにクエリを発行すると、データベースへの負荷が甚大になります。実務では、このスクリプトをCLIからcronで定時実行し、静的ファイル(sitemap.xml)を書き出す運用がベストプラクティスです。
二つ目はパーマリンクの整合性です。WordPressの設定変更時にパーマリンク構造が変わる可能性があるため、取得には必ずget_permalink関数を使用してください。
最後に、XMLの生成はブラウザに直接出力する際はContent-Typeヘッダーを「application/xml」に設定することを忘れないようにしましょう。

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