The SEO FrameworkのサイトマップにBogoの英語記事を追加する方法
WordPressで多言語化を行う際、シンプルで軽量なプラグインとして「Bogo」は広く利用されています。一方で、SEOプラグインとして「The SEO Framework(以下、TSF)」を併用している環境では、標準のXMLサイトマップ生成において仕様上の問題が発生します。
Bogoを用いて日本語記事の翻訳版(英語記事など)を作成・公開しても、TSFが自動生成するサイトマップ(sitemap.xml)には日本語の元記事しか出力されず、英語記事のURLが一切追加されません。この状態を放置すると、検索エンジンのクローラーに対して多言語記事の存在が通知されず、インデックス登録の大幅な遅延や機会損失を招く要因となります。
XMLサイトマップへの英語記事URLと更新日時の自動登録
本記事の目的は、Bogoによって作成された公開済みの英語記事(ロケールが en_US の投稿)を、TSFが生成するXMLサイトマップへ動的かつ自動的に追加することです。
単にURLを追加するだけではなく、各記事の最終更新日時(Lastmod)も正確に紐付けて出力させます。これにより、新規記事の公開時や過去記事の更新時に検索エンジンクローラーが適切な更新情報を取得できる環境を整えます。
サイトマップへの追加と反映を阻む3つの技術的要因
検証を進める中で、英語記事のサイトマップ追加および正常表示を阻害している要因が3点判明しました。
Bogoによるクエリの自動フィルタリング
WordPress標準の関数(get_postsなど)で記事を取得しようとすると、Bogoの内部フィルターが働き、現在の言語コンテキスト(デフォルトは日本語)以外の記事をクエリ結果から自動的に除外してしまいます。そのため、通常のクエリでは英語記事が0件として処理されます。
The SEO Frameworkが要求する配列仕様の厳格性
TSFのサイトマップ拡張用フィルターフック(the_seo_framework_sitemap_additional_urls)は、URLを配列の「キー」として受け取り、その値に「連想配列形式のメタデータ」を格納する仕様になっています。フォーマットが一致しない場合、URLが数値インデックス化されたり、更新日時(lastmod)が破棄されて空欄になります。
WebサーバーおよびCDNによる多層キャッシュ
OpenLiteSpeedのキャッシュモジュール(LiteSpeed Cache)やQUIC.cloud CDNが有効な環境では、sitemap.xml へのアクセスが静的ファイルとしてエッジサーバー等に強力にキャッシュされます。これにより、functions.php のPHP処理そのものがバイパスされ、設定変更やデバッグログが出力されない状態に陥ります。
functions.phpによるフック実装と多層キャッシュ除外設定
上記の要因を解消するため、データベースからの直接データ取得、TSF仕様に準拠した連想配列の構成、およびキャッシュ除外設定を実施します。
functions.php へのコード追加
子テーマの functions.php に以下のコードを追記します。Bogoのクエリ除外を回避するために $wpdb を用いてデータベースから直接 en_US の記事IDと更新日時を取得し、TSFの仕様に合わせた配列構造へ代入します。
// =================================================================
// The SEO Framework: Bogo英語記事をサイトマップに追加(公式仕様準拠)
// =================================================================
add_filter( 'the_seo_framework_sitemap_additional_urls', function( $custom_urls ) {
global $wpdb;
if ( ! is_array( $custom_urls ) ) {$custom_urls = array();
}
// 1. MariaDBから直接「en_US」の公開記事IDと更新日時を取得
$en_posts =$wpdb->get_results( "
SELECT p.ID, p.post_modified_gmt
FROM {$wpdb->posts} p
INNER JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id
WHERE p.post_status = 'publish'
AND p.post_type = 'post'
AND pm.meta_key = '_locale'
AND pm.meta_value = 'en_US'
" );
if ( empty( $en_posts ) ) {
return $custom_urls;
}
// 2. TSF公式仕様に沿った連想配列形式で代入(キーにURL、値にlastmod配列)
foreach ( $en_posts as$post ) {
$permalink = get_permalink($post->ID );
if ( function_exists( 'bogo_url' ) ) {
$permalink = bogo_url($permalink, 'en_US' );
}
$custom_urls[$permalink ] = array(
'lastmod' => $post->post_modified_gmt,
);
}
return $custom_urls;
}, 10, 1 );
LiteSpeed Cacheの除外設定
サイトマップが動的に生成されるよう、LiteSpeed Cacheの除外設定を追加します。
WordPress管理画面の「LiteSpeed Cache」>「キャッシュ」>「[4] 除外」を開き、「キャッシュしないURI」に以下を登録します。
/feed /feed/ sitemap.xml sitemap_index.xml /sitemap /wp-sitemap
また、静的CDN機能を利用している場合は、「[CDN]」>「その他の静的 CDNの設定」の「除外パス」にも sitemap.xml および sitemap_index.xml を追加します。
キャッシュの完全パージ
設定保存後、以下のキャッシュを完全に破棄します。
- WordPress管理画面「SEO」設定を開き、「変更を保存」をクリックしてTSF内部のトランジェントキャッシュを再生成。
- LiteSpeed Cacheの「すべてをパージ」を実行。
- QUIC.cloudのダッシュボードまたは管理画面から「CDNキャッシュのパージ」を実行。
サイトマップでの英語URLとLast Updatedの正常表示
キャッシュパージ後、ブラウザおよびターミナルからサイトマップエンドポイントへアクセスして検証を行いました。
検証URL:
https://donguri3.net/sitemap.xml
出力結果として、CDNおよびWebサーバーのキャッシュステータスがバイパスされ、XMLソース内に英語記事のURL(例: https://donguri3.net/en/…)がすべて追加されていることを確認しました。また、各URLに対応する <lastmod> タグに正確な更新日時が出力され、ブラウザのXSLスタイルシート表示上でも「Last Updated」欄に正しい日時が表示される状態を確認できました。
まとめ
Bogoで作成した英語記事がThe SEO Frameworkのサイトマップに出力されない問題に対し、原因の特定と対策を行いました。Bogoの言語フィルターを回避するために$wpdbで直接データを抽出し、TSFの仕様に準拠した連想配列構造でフックへ渡すコードを実装しました。さらにLiteSpeed CacheおよびQUIC.cloud CDNのキャッシュ除外とパージを実施した結果、サイトマップ上に全英語記事のURLと正確な更新日時が正常に反映されました。