follow us in feedly
PHP

PHPで「前のページに戻る」を実装

「前のページに戻る」ボタンはJavaScriptによる実装が手軽ですが、前のページが無い場合(ブックマークからの場合)や、外部サイト(検索サイトなど)から来た場合はボタンを非表示にしたいのでPHPで実装してみたいと思います。ワードプレスではカテゴリーなどを活用している場合はあると便利なインターフェイスです。

2019年3月20日

「前のページに戻る」ボタンの完成形

まずは完成形の確認です。ワードプレスにおいては下記図のように詳細ページにたどり着く経路がひとつとは限りません。ひとつの記事が複数のカテゴリーに属することも多々あるでしょうし、そもそも詳細ページのテンプレートをカテゴリーの数だけ用意せずにひとつでまかなうことの方が多いでしょう。
 またSEO対策的には内部リンクを充実させることも重要ですから、他の投稿や固定ページなどから特定の詳細ページにリンクが張られることもあるでしょう。どのようなケースにおいても、来たページにすんなり戻れるという導線を準備しておくことはユーザーに対してはとても親切かと思われます。「前のページに戻る」ボタンというと非常に古典的な感じがしますが、いまでも重要なインターフェイスのように思います。

ワードプレス 「前のページに戻る」ボタン

実際に「前のページに戻る」ボタンを実装するにあたっては、必要のない場合は非表示にする工夫が必要です。例えば、ブックマークから来た場合は前のページが無いわけですし、検索サイトなどから来た場合は前のページに戻ってしまうと離脱することになりますのでボタンを表示しない方がいいでしょう。具体的にはサイト内の他のページから来た場合のみ表示したいと思います。

ワードプレス 「前のページに戻る」ボタン

PHPでは$_SERVER変数を利用

それではPHPを使った記述です。PHPでは$_SERVERという変数の中にいろいろな情報が格納されています。
PHP: $_SERVER – Manual

// var_dump($_SERVER);

array(36) {
  ["SERVER_SOFTWARE"]=>
  string(78) "Apache/2.4.29 (Unix) OpenSSL/1.0.2m PHP/7.1.11 mod_perl/2.0.8-dev Perl/v5.16.3"
  ["REQUEST_URI"]=>
  string(5) "/article/"
  ["REDIRECT_STATUS"]=>
  string(3) "200"
  ["HTTP_HOST"]=>
  string(12) "example.com"
  ["HTTP_USER_AGENT"]=>
  string(82) "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:65.0) Gecko/20100101 Firefox/65.0"
	・
	・
	・

このなかのHTTP_REFERERというプロパティに前のページのアドレスが格納されていますのでそれを利用します。

<a href="<?php echo $_SERVER['HTTP_REFERER']; ?>">前のページに戻る</a>

ただし、前のページが存在しない場合は$_SERVER[‘HTTP_REFERER’]が空になりますので、この場合は「前のページに戻る」をクリックしても遷移しません(ページがリロードされる)。これではユーザーからしたらおかしな挙動になりますので、これに対応する形として以下のように記述をします。$_SERVER[‘HTTP_REFERER’]が空でない場合のみ「前のページに戻る」を表示します。

<?php if (!empty($_SERVER['HTTP_REFERER']) : ?>
<a href="<?php echo $_SERVER['HTTP_REFERER']; ?>">前のページに戻る</a>
<?php endif; ?>

strposを使用したサイト内アクセスかどうかの判定

もうひとつ工夫をしてみたいと思いますが、検索サイトなどの外部のページから来た場合は「前のページに戻る」を非表示にしたいと思います。逆に言いますと、前のページがサイト内の他のページだった場合にのみ「前のページに戻る」を表示するようにします。
 $_SERVER[‘HTTP_HOST’]という値のなかに自分のサイトのホスト名が格納されています。ホスト名はexample.comのような文字列です。前のページのURL($_SERVER[‘HTTP_REFERER’])にこのホスト名が入っていればサイト内の他のページからの遷移ということになります。

PHPの組み込み関数strposは特定の文字列のなかに求める文字列があるかどうかを探してくれる関数です。求める文字列があった場合には、何文字目からその文字列が入っているかを数値で返してくれ、なかった場合はfalseが返ってきます。

$host_name = 'example.com';
$i = strpos('http://example.com/about/', $host_name);
echo $i; // →この場合7が返ってくる

例えば$_SERVER[‘HTTP_HOST’]がexample.comで$_SERVER[‘HTTP_REFERER’]がhttp://example.com/about/の場合は7という数値が返ってきます。ですのでなにがしかの数値(先頭にある場合は0が返ってくるので0も含む)が返ってくれば(つまりfalse以外のものが返ってくれば)、求める文字列が存在しているということになりますので、まとめると以下のような記述になりこれで「前のページに戻る」ボタンの完成です。
PHP: strpos – Manual

<?php $host_name = $_SERVER['HTTP_HOST']; ?>
<?php if (!empty($_SERVER['HTTP_REFERER']) && (strpos($_SERVER['HTTP_REFERER'], $host_name) !== false)) : ?>
<a href="<?php echo $_SERVER['HTTP_REFERER']; ?>">前のページに戻る</a>
<?php endif; ?>

ちなみに、ここではstrpos($_SERVER[‘HTTP_REFERER’], $host_name)の値が0の場合でも条件が真にならないといけませんので厳密比較演算子(!==)が必要です。
PHP: PHP 型の比較表 – Manual

// 緩やかな比較
0 == false // 真
0 != false // 偽

// 厳密な比較
0 === false //  偽
0 !== false //  真

以上で「PHPで「前のページに戻る」を実装」の解説を終わります。

このエントリーをはてなブックマークに追加