簡単に新しいURLにリダイレクトする方法 ? function.php編 #function.php #リダイレクト #日付だけのパーマリンク #function.php #リダイレクト #日付だけのパーマリンク

  • 作成日:2020-7-13

何十、何百のページをリダイレクトするのは大変。そんな場合にfunction.phpちょっとコーディングすればできますよ!

/wp/wp-content/uploads/img/banner/banner/banner10.jpg photo
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兆以上の記事数にならない限りというか無理でしょう。重ならないので十分でしょう。

以上

スポンサーリンク

ランキング

記事連動目次

※右側の記事と連動したインデックスです。見たいインデックスをクリックしてください。
ページ上部へ戻る