WordPress をバージョン 5.4.1 にアップデートしたところ、投稿が正常に見られなくなってしまった。投稿ページを見ようとするとアーカイブページが表示されてしまう状態だ。
このブログではパーマリンクに /archive/%year%%monthnum%%day%%hour%%minute%%second%/ というふうに設定をしていたのだが、どうやら WordPress では日時のみのパーマリンクは仕様上許容されているわけでなく、post_id もしくは postname のどちらかを含めないといけないらしい。それが 5.4.1 からより厳格に処理を行うようになったようだ。だったらパーマリンクの設定欄にでもそういう風に注意書き表示して欲しいんだけど。。。
wordpress 5.4.1 からの障害について | WordPress.org 日本語
文句言ってもしょうがないので新しい仕様に合わせてパーマリンクの変更とリダイレクトの設定を行っていこう。
パーマリンクは post_id を用いた形にする。本当は投稿名を利用したパーマリンクにしたかったがろくに設定していなかったので、post_id を利用する他ない。流石に 3000 以上ある記事の slug を指定しなおすのは苦行だ。
パーマリンクの設定自体は WordPress の標準で用意されている一覧の中から「数字ベース」を選択するだけだ。
それからリダイレクトの処理を書く。こちらも一つ一つ .htaccess などに書いていくのは現実的ではないので、functions.php にリダイレクトの処理を記述する。
function redirectToNewUrlRule() {
$_url = explode('/', $_SERVER['REQUEST_URI']);
if (count($_url) < 3) {
return false;
}
$matches = [];
// these args are depend on your permalink setting
if (preg_match('/^[0-9]{14}$/', $_url[3], $matches)) {
$args = array(
'ignore_sticky_posts' => true,
'date_query' => array(
'year' => substr($matches[0], 0, 4),
'month' => substr($matches[0], 4, 2),
'day' => substr($matches[0], 6, 2),
'hour' => substr($matches[0], 8, 2),
'minute' => substr($matches[0], 10,2),
'second' => substr($matches[0], 12,2),
),
);
$amp = $_url[4] == 'amp' ? '/amp/' : '';
$the_query = new WP_Query( $args );
if ( $the_query->have_posts() ) {
while ( $the_query->have_posts() ) {
$the_query->the_post();
if ($the_query->found_posts == 1) {
// redirect
// setting by myself or just use get_permalink() method
$url = home_url('/archives/' . get_the_ID() . $amp);
wp_redirect( $url, 301 ); exit;
}
}
wp_reset_postdata();
}
}
}
redirectToNewUrlRule();
このコードはあくまで俺のブログの場合なのでそのままコピペしても動かないと思う。もし使うなら各自適当に修正してほしい。
こんな感じで指定しておけば古い形式である /wp/archive/20200430010203/ という URL を /archives/12345 という post_id を用いた URL にリダイレクトしてくれる。
コメント