記事内に広告が含まれています

【ワレコのWordPress】存在しないページを一つ上のurl階層にリダイレクト

この記事は約10分で読めます。
スポンサーリンク

ワテの場合、WordPressを使い始めて約三年だ。

使い始めた当初は、右も左も分からない状況で有ったが、今では前か後ろかくらいは分る。

なんのこっちゃ。

パンツか!

ちなみに、ワテは最近はこんなステテコを着用している。

蒸し暑い日本の夏にはステテコはとても快適だ。

 

さて、ASP.NET MVCやWordPressを使って数多くのウェブサイトを作って来たワテであるが、最近ではGoogleのSEOと言うのも少しは意識している。

つまりまあSEOと言うのは、ワテの理解ではサーチエンジンさんに高く評価して貰える努力をする事かな。

ちょっと違うか。

まあいい。

そう言う場合に、例えばWordPressのサイトで、

https://www.wareko.jp/blog/ニュース/

こんなアドレスに記事を書いていたとして、でも、何らかの事情が有って、そのページを削除したとしよう。

そうすると、このアドレスに来た訪問者さんは

ページが見つかりませんでした
404 NOT FOUND

が表示される。

それを改良して、ページが存在しない場合には一つ上のurlの階層にリダイレクトするようにしてみた。

つまり、

https://www.wareko.jp/blog/ニュース/

が無い場合には

https://www.wareko.jp/blog/

を表示するのである。

では、本題に入ろう。

スポンサーリンク
スポンサーリンク

WordPressのパーマリンク設定はややこしい

ワードプレスの設定の中に、「パーマリンク設定」と言うのがある。

パーマリンク設定では、ブラウザーのアドレス欄に表示されるurl文字列の形式を指定する事が出来る。

デフォルトだと以下の形式だ。

基本  https://www.wareko.jp/blog/?p=123

WordPress初心者だった当時のワテは、ここで

?p=123

の部分が気になった。

なんでクエスチョンマークがあるのか?

「p=123」って何なの?

沢山の疑問が湧いた。

今では、ほぼ理解出来ている(つもりだ)。

つまり、

クエスチョンマーク?の意味は、サーバー側に何らかのパラメータを送信したい場合にこのようなクエスチョンマークを使って記述するのだ。

一般化するとこんな感じ。

 https://www.wareko.jp/blog/?parm1=val1&parm2=val2&parm3=val3・・・

最初の一つはクエスチョンマーク?で始まり、二番目以降はアンパサンド&で連結する決まりになっている。

利用者さんがブラウザーでこのようなURLを開くと、

https://www.wareko.jp/blog/

のサイトが稼働しているサーバーには、

parm1=val1
parm2=val2
parm3=val3
・・・

のパラメータが送信されて来る。

サーバーサイドではそれらを使って各種の処理が出来るのだ。

良くあるのは、何らかの検索機能など。

アマゾン、楽天、ヤフーショッピングなどのページで商品検索を実行すると、URLに多数のパラメータが連結されているのが分るだろう。

冒頭の、

基本  https://www.wareko.jp/blog/?p=123

の場合には、WordPressサイトに対して p=123 と言う情報を送信している。

123は post id と言う固有の数字で、WordPressの記事を投稿すると自動的に割り当てられる整数値だ。

まあ例えて言えばマイナンバーみたいなもんかな。

記事一つ一つに割り当てられるユニークな数字。その数字によって一意に記事を識別出来る。

そしてWordPressはそのpost id番号の記事を表示するのだ。

なお、こう言う場合の「ユニーク unique」と言うのは、「面白い」とか言う意味では無くて、「唯一の」とか「一意的な」と言う意味だ。

WordPressではパーマリンク設定をカスタマイズ出来る

パーマリンク設定で、

カスタム構造 https://www.wareko.jp/blog/%postname%

を選択する事も出来る。

この場合には、%postname% と言うのを連結しているが、これは文字通り投稿した記事に割り当てられる名前である。

他にも利用可能なタグは以下のものがある。

  • %year%
  • %monthnum%
  • %day%
  • %hour%
  • %minute%
  • %second%
  • %post_id%
  • %postname%
  • %category%
  • %author%

デフォルトでは、postname には、

post-123

のような名前が付けられる。

つまり、post id の数字の前に post-  が付いた形式だ。

なお、このpostnameは別名でslug(スラッグ)とも呼ばれる。

投稿した記事のslug(=postname)は、その記事の編集画面で自分で自由に変更出来るので、ワテの場合には、投稿記事のタイトルを英語に翻訳したものを使う事が多い。

そして、パーマリンク設定は上記のpostnameを使う形式にしている。

カスタム構造 https://www.wareko.jp/blog/%postname%

ワテが採用しているパーマリンク設定

なお、過去には以下の形式のパーマリンクを採用していた。

カスタム構造 https://www.wareko.jp/blog/%category%/%postname%

ワテが以前採用していたパーマリンク設定

この形式を使っている人は多いが、以下の理由でcategoryを付けるのは中止してpostnameだけにしたのだ。

それは、以下に引用するGoogleの

「検索エンジン最適化(SEO)スターター ガイド」

を読んだから。

そのガイドの中に以下の記述がある。

コンテンツの情報を伝えるわかりやすい URL

ウェブサイトのドキュメントにわかりやすいカテゴリやファイル名を使用すると、サイトを効果的に整理できるだけでなく、コンテンツにリンクしようとするユーザーにとって、より簡単で「フレンドリー」な URL を作成することができます。理解できない単語が含まれる極端に長く暗号のような URL は、訪問者を困惑させることがあります。

わかりにくい数値のページ名のページ URL。

上の画像のような URL はわかりにくく、フレンドリーではありません。ユーザーはこの URL へのリンクを作成するのが難しいと感じるかもしれません。

人が読める形式のわかりやすいページ名の URL。ページへのリンクを貼る際にそのページの URL をアンカー テキストとして使用するユーザーもいます。URL に関連する単語が含まれていると、ID や奇妙な名前のパラメータよりも、ページについての情報をユーザーに提供することができます。

引用元 https://support.google.com/webmasters/answer/7451184?hl=ja

まあ要するに、ユーザーフレンドリーなURLにすることが重要であり、具体的には、URLには意味不明な数字(パラメータなど)をズラズラと表示するのでは無くて、人が見て分る文字が含まれている方が良いと言うガイドだ。

categoryを廃止した理由は、categoryが無くてもその後のpostnameだけで重要な内容を伝えられるようにしているから。

例えばこんな感じで。

https://www.wareko.jp/blog/linq-groupby-sort-and-count-up-numbers

その記事がこちら。

【ワレコのC#】LINQでグループ化してソートして数をカウントし集計する
このところ、久しぶりにC#を使ってプログラミングをしている。 EntityFrameworkを使ってデータベースを操作するプログラムだ。 ワテがデータベースを使えるようになったのは、2、3年前なので、まだあまり詳しくはない。 でも、最近では...

 

WordPressで404を表示させずに一つ上の階層にリダイレクトする

さて、前置きが長くなったが、WordPressのサイトにおいて、

カスタム構造 https://www.wareko.jp/blog/AAA/BBB/CCC/

のURLにある記事を何らかの理由で削除したとする。

その場合には、WordPressのデフォルト動作では、「404 NOT FOUND」のページが表示されるのだが、それを改良して、一つ上の階層

カスタム構造 https://www.wareko.jp/blog/AAA/BBB/

にリダイレクトするようにしてみた。

ただし、一つ上の階層が無い場合もある。

その時にはルートへリダイレクトするようにした。

 

一つ上の階層が無ければもう一つ上の階層を探すなどと言った再帰的な処理でも良いのだが、そもそもそんなに深い階層のURLは採用していないので、取り敢えず一個上の階層が有ればそこにリダイレクトする。

無ければルートにリダイレクトすると言う動作で実用上は足りるからだ。

 

そのPHPソースコードが以下の通り。

add_action( 'template_redirect''is404_redirect_home' );
function is404_redirect_home() {
  if( is_404() ){
	
	global $wp;
	//x $url = get_permalink();	// 空文字列だ
	$url = home_url( $wp->request );
 
	$url_arr = explode('/'$url);
	array_pop($url_arr);
	$url_new = implode('/'$url_arr); 
 
 
	$f_exist = url_exists($url_new);
	if($f_exist){
 
		wp_safe_redirect( $url_new, 301 );
	}else{
 
		wp_safe_redirect( home_url( '/' ), 301 );
	}
 
    exit();
  }
}
 
 
function url_exists($url){
 
	$file_headers = @get_headers($url);
	
	//var_dump($file_headers);

	if(!$file_headers || $file_headers[0== 'HTTP/1.1 404 Not Found') {
	    $exists = false;
	}
	else {
	    $exists = true;
	}
	return $exists;
}

WordPressで404 NOT FOUNDを表示せずに一つ上の階層を表示するアクションコード

 

このPHPプログラムをfunction.phpに書き込んでおくと良い。

要点としては、スラッシュ/で区切られているurlの末端の部分を除去して一つ上の階層のurlを求める処理は以下の通り。

 	$url_arr = explode('/'$url);
	array_pop($url_arr);
	$url_new = implode('/'$url_arr); 

これで、

 https://www.wareko.jp/blog/AAA/BBB/CCC/

 https://www.wareko.jp/blog/AAA/BBB/

に変換出来る。

あとは、url_exists($url) と言う関数を即席で作ったのだが、その$urlが存在しているかどうか判定する関数だ。

もし、単純にルートにリダイレクトしたいならば、is404_redirect_home()の中で、

	wp_safe_redirect( home_url( '/' ), 301 );

を実行するだけで良い。

まあ、PHPプログラミングもWordPressカスタマイズも初心者レベルのワテなので、ここで紹介した手法が正統的な手法なのかどうかは自信が無い。

でもまあ動いているので多分問題は無いと思う。

まとめ

当記事では、WordPressのサイトにおいて、パーマリンク設定の変更方法などを紹介した。

パーマリンク設定を変更するとurlの表記が変わるので、Googleなどの検索エンジンに登録されている自分のサイトの古いアドレスをクリックしても404 NOT FOUNDになってしまう。

それを避ける為に、もし一つ上のアドレスが有る場合はそのアドレスにリダイレクトする。

もし一つ上のアドレスが存在しない場合には、ルートにリダイレクトする手法を紹介した。

SEO的にはそれで良いのかどうかは良く分からない。

本を読む

ちなみに、ワテはどれも読んでいない。

しかし、やはりプログラミングを勉強するには、どんな本でも良いから一冊を読み通すのが良いと思う。

全部を理解出来なくても、取り敢えず読み通しておけば、どんな道筋でやって行けば良いのかが把握できるので。

つまりまあ、本を全く読まずにただ闇雲にやるよりも、何らかのガイドに従ってやる方が効率は良い。

スポンサーリンク
コメント募集

この記事に関して何か質問とか補足など有りましたら、このページ下部にあるコメント欄からお知らせ下さい。

PHPWordPress
スポンサーリンク
シェアする
warekoをフォローする
スポンサーリンク
われこ われこ

コメント