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=yes04 / 本文
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 の正規化が原因
- 直すのは子テーマ側。親を直すと更新で消える
コメント
この記事へのコメント
お名前だけで投稿できます。アカウント登録やログインは不要です。 いただいたコメントは確認のうえ公開します。