WordPressで、投稿やカテゴリなどのスラッグをリネームした際、古いスラッグに新しいスラッグへのリダイレクトが自動的に設定されます。
これは便利な一方で、古いスラッグ(URL)に新しいコンテンツを配置したい場合などに問題が発生します。
WordPressのリダイレクト設定はデータベースのwp_postmeta
テーブルに_wp_old_slug
の値として保存されているようなので、この値を探して削除することで手動で取り除くことも可能です。
また、もう一つの手段として、フィルターフックを使って一時的にこれらのリダイレクトを無効にする方法があります。
自動リダイレクトを行うアクションを取り除くフィルターフック
functions.phpなどに以下の2行を追記します。
remove_action('template_redirect', 'wp_old_slug_redirect');
remove_action('template_redirect', 'redirect_canonical');
正確な仕様が見つけられていないのですが、リネームなどによって書き換えられたスラッグは上記のいずれかのアクションで新しいURLに置き換えられるようです。
コードリファレンスなどを見る限り、wp_old_slug_redirect
のフックでリダイレクトが取り除けるようなのですが、カテゴリなどのタクソノミーのスラッグを変更した場合はredirect_canonical
が効いているようで、1行目の記述だけではうまく動きませんでした。URLが404だったり同名のタクソノミーがいたりいなかったりでちょっと動作が変わっているようです。
ちなみに、スラッグのリネームを繰り返したりリダイレクトのプラグインなどを使ってリダイレクトループが発生したような場合も上記のコードでとりあえず止めることができます。(本来残しておきたいリダイレクトも止まってしまいますが。)
補足
なお補足ですが、WordPressはパーマリンクを探索する際、完全一致ではなく前方一致で探す仕様になっています。
たとえば、パーマリンクが/my-favorite-things
のようなスラッグの投稿があった場合、/my-favorite
や、/my-fav
などはすべて/my-favorite-things
のページにリダイレクトします。このあたりもトラブった際の症状の切り分けを行う際にハマりがちなポイントなので注意してください。
コメント