つ積み上げログ技術ブログ記事一覧へ

自主執筆記事

AFFINGERはwp-sitemap.xmlを無効化している|404になる原因と3段の直し方

WordPressのサイトマップが1本も存在せず、Search Consoleで取得できませんでしたになっていた。原因はテーマが本体のサイトマップを切っていたこと。1つ直すと次が出てくる3段構えだった。

サイト運営公開: 2026/10/02更新: 2026/10/02
WordPressAFFINGERサイトマップwp-cliSearch Console

01 / 本文

サイトマップが1本も無かった

Search Console で「サイトマップを取得できませんでした」と出た。URLを直接開くと404。

/wp-sitemap.xml も /sitemap.xml も /sitemap_index.xml も、全部404だった。WordPress 5.5 以降は本体がサイトマップを持っているので、何も入れなくても出るはずのものが無い。

02 / 本文

1段目 テーマが本体のサイトマップを切っていた

テーマの functions.php に、本体のサイトマップを止める記述があった。

// WordPress5.5本体のサイトマップ(wp-sitemap.xml)を無効化
if ( trim( $GLOBALS['stdata505'] ) === '' ) {
    remove_action( 'init', 'wp_sitemaps_get_server' );
}

03 / 本文

オプションが未保存だと既定で無効

判定に使っているオプションはテーマ管理画面のチェックボックスで、新規サイトでは未保存のままになっている。空文字と判定されて remove_action が走る。

つまりテーマを入れた時点で、必ず /wp-sitemap.xml が404になる。 設定を触っていないほうが壊れている、という形。

wp option add st-data505 yes --autoload=yes

04 / 本文

2段目 wp-cli の rewrite flush では入らない

オプションを入れても404のままだった。wp rewrite flush を何度叩いても変わらない。

テーマのグローバル変数は WP-CLI の実行中は未定義。 だからCLIの中でも remove_action が走り、フラッシュしてもサイトマップのリライトルールが1本も書かれない。

Undefined global variable の警告が出るのが目印になる。フロント側では有効なので、robots.txt には Sitemap: の行だけ出て、そのURLは404という食い違いが起きる。

wp eval "wp_sitemaps_get_server(); flush_rewrite_rules();"

05 / 本文

3段目 子サイトマップが301で自分に戻る

/wp-sitemap.xml は200になったが、/wp-sitemap-posts-post-1.xml だけが301を返し、飛び先が自分自身だった。無限ループになる。

原因はテーマ側の正規化処理だった。リライトルールが内部的に paged=1 を立てるのに対し、テーマは paged=1 を「1ページ目の重複URL」と見て paged を外したURLへ301する。この paged はクエリ文字列に無いのでURLが変わらず、同じURLへ301し続ける。

/wp-sitemap.xml には paged が無いので200、-1.xml だけ301、という出方になる。

06 / 本文

親テーマを直さない

子テーマで、サイトマップのリクエストに限って親のフックを外した。親テーマを直すと更新で消える。

フック自体は消さない。/page/1/ の正規化は必要な処理なので、消すと別の重複が出る。

07 / 本文

確かめ方

3段あるので、どこまで進んだかを分けて見る。

curl -s -o /dev/null -w '%{http_code} %{redirect_url}
' https://example.jp/wp-sitemap.xml
curl -s -o /dev/null -w '%{http_code} %{redirect_url}
' https://example.jp/wp-sitemap-posts-post-1.xml
curl -s https://example.jp/wp-sitemap-posts-post-1.xml | grep -c '<loc>'

08 / 本文

まとめ

- テーマが本体のサイトマップを切っていることがある - 判定に使うオプションが未保存だと既定で無効 - wp rewrite flush ではルールが入らない。wp eval で直接呼ぶ - 子サイトマップだけ301で自分に戻るのは paged=1 の正規化が原因 - 直すのは子テーマ側。親を直すと更新で消える

コメント

この記事へのコメント

お名前だけで投稿できます。アカウント登録やログインは不要です。 いただいたコメントは確認のうえ公開します。