何十、何百のページをリダイレクトするのは大変。そんな場合にfunction.phpちょっとコーディングすればできますよ!
wordpress5.4.2で日付だけのパーマリンクが誤動作
事の発端は、最近リリースされたWordpressのバージョン5.4.2から日付だけのパーマリンクが誤動作するようになり、投稿ページを開こうとするとアーカイブ一覧を表示するようになってしまった。多分OSの不具合かと静観するつもりでしたが、もともと日付だけのパーマリンクは許可されていないようです。
他のブロガーさんもサーバーの引っ越しを考えて、日付をパーマリンクにしている方は多いはず。当方もそんな一人でリダイレクト方法を考えていて思いついたのがこの方法。
function.phpの中でリダイレクトしちゃおう!!
プログラムで301リダイレクト
やっているのは、リダイレクト対象のURLがきた場合にポストIDをベースにしたURLに変更し、wp_redirect関数でリダイレクトする。対象以外の場合はもちろん処理しない。
例えば、2020年7月12日13:00:00分の記事がポストIDが1000だったら
20200712130000.html
1000.html
対象のURLかどうかは、preg_matchで14桁の数字+”.html”で正規表現\d{14}\.htmlで検索すればいい。そして、該当のポストIDは、日付からwp_queryで該当の記事を検索し、get_the_id()でポストIDが求まる。私の場合は以下のようにコーディングした。
<?php $thisPath = parse_url( $_SERVER["REQUEST_URI"] , PHP_URL_PATH ); //ファイル名のみ取り出す $cnt = preg_match( "/^\/(\d{14})\.html/", $thisPath, $matches ); if( $cnt ) { $args = array( 'ignore_sticky_posts' => true, 'date_query' => array( array( 'year' => substr($matches[1], 0, 4), 'month' => substr($matches[1], 4, 2), 'day' => substr($matches[1], 6, 2), 'hour' => substr($matches[1], 8, 2), 'minute' => substr($matches[1], 10,2), 'second' => substr($matches[1], 12,2), ), ), ); $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) { $url = home_url( get_the_ID() . ".html"); wp_redirect( $url, 301 ); exit; } } wp_reset_postdata(); } } ?>
上記をfunction.phpの先頭にコーディングすると対象のURLはすべて301リダイレクトされる仕組みとなります。
変更前も変更後も同じ数字のみのURLとなりますが、14桁だと202兆以上の記事数にならない限りというか無理でしょう。重ならないので十分でしょう。
以上