【WordPress】遷移元ページのURLを取得して戻るボタンを設置する方法|wp_get_referer・history.back

記事の下部などに「戻る」ボタンを置くと、一覧から来た読者が元のページへ戻りやすくなり、回遊性が上がります。この記事では、PHP(wp_get_referer)で遷移元URLを取得する方法と、JavaScript(history.back)で戻る方法を比較しながら解説します。

2つの実装の使い分け

  • PHP版wp_get_referer):リンクとしてURLを明示できるが、キャッシュと相性が悪い
  • JS版history.back() / document.referrer):キャッシュの影響を受けない。キャッシュ利用サイトはこちら
スポンサーリンク

PHPで遷移元URLを取得する(wp_get_referer)

WordPress標準の wp_get_referer() で遷移元のURLを取得できます。リファラが取れないことがあるため、存在チェックをしてから、esc_url() でエスケープして出力します。

PHP:リファラがあるときだけ戻るボタンを表示
<?php
$referrer = wp_get_referer();
if ($referrer) {
  echo '<a href="' . esc_url($referrer) . '" class="back-button">戻る</a>';
}
?>
wp_get_referer() は同一サイト内のみ返す
wp_get_referer() は内部で wp_validate_redirect() を通すため、自サイト内からの遷移だけURLを返します。検索エンジンや外部サイトから来た場合・URLを直接入力した場合・現在ページと同じURLの場合は false になり、ボタンは表示されません(外部URLへ誘導しない安全な挙動です)。

single.php に組み込むサンプル

記事ページの本文の下に設置する例です。

single.php:記事の下に戻るボタンを追加
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
  <article>
    <h1><?php the_title(); ?></h1>
    <div><?php the_content(); ?></div>

    <?php
    // 戻るボタン(リファラがあるときだけ)
    $referrer = wp_get_referer();
    if ($referrer) {
      echo '<a href="' . esc_url($referrer) . '" class="back-button">戻る</a>';
    }
    ?>
  </article>
<?php endwhile; endif; ?>
style.css:ボタンのスタイル
a.back-button {
  display: inline-block;
  margin-top: 20px;
  padding: 10px 15px;
  background-color: #333;
  color: #fff;
  border-radius: 4px;
  text-decoration: none;
  transition: background-color 0.3s;
}

a.back-button:hover {
  background-color: #555;
}

注意:ページキャッシュ環境ではPHP版は使わない

キャッシュに「他人のリファラ」が焼き込まれる
PHP版はリファラをHTMLに直接出力します。キャッシュプラグインやCocoonの高速化(HTMLキャッシュ)が有効だと、最初にアクセスした人のリファラ入りHTMLがキャッシュされ、全員に同じ「戻る先」が配られます。キャッシュを使っているサイトでは、次のJavaScript版を使ってください。

JavaScriptで戻るボタンを実装する(キャッシュ環境向け)

ブラウザの履歴を1つ戻る history.back() が最も簡単です。キャッシュの影響を受けず、リファラ送信の設定にも左右されません。

HTML:history.back で戻るボタン
<button type="button" onclick="history.back()" class="back-button">戻る</button>

「履歴が無いときはボタンを出したくない」「遷移元URLをリンクとして使いたい」場合は document.referrer を使います。自サイト内からの遷移のときだけ表示する例です。

JavaScript:自サイト内からの遷移のときだけ表示
document.addEventListener('DOMContentLoaded', function () {
  var ref = document.referrer;
  // リファラがあり、自サイト内からの遷移のときだけボタンを作る
  if (ref && ref.indexOf(location.origin) === 0) {
    var a = document.createElement('a');
    a.href = ref;
    a.textContent = '戻る';
    a.className = 'back-button';
    document.querySelector('.entry-content').appendChild(a);
  }
});

「常に一覧へ戻す」ならリファラを使わない

「詳細ページから必ずカテゴリー一覧へ戻したい」など戻り先が決まっている場合は、リファラに頼らず固定のURLやURLパラメータで実装するほうが確実です。一覧のリンクに ?return_url=... を付けて渡す方法はURLパラメータを取得して表示を切り替える方法、検索結果へ条件を保持して戻る実装は検索結果から遷移後に検索条件を保持して戻る方法を参照してください。前後の記事への移動なら前後の投稿へのリンクを作成する方法、現在のURLの取得は現在のURLを取得して処理を切り替える方法が参考になります。

よくある質問(FAQ)

QWordPressで前のページのURLを取得するには?
APHPなら wp_get_referer()(同一サイト内のみ・要 esc_url())、JavaScriptなら document.referrer で取得できます。ただしリファラはブラウザ設定や遷移方法によって送信されないことがあるため、確実に戻り先を制御したい場合はURLパラメータで渡す方法が信頼できます。
Qhistory.back() とリファラのリンク、どちらがよいですか?
Ahistory.back() は実装が最も簡単でキャッシュの影響を受けません。リファラのリンクは「戻り先URLを明示できる」利点がありますが、PHPで出力するとキャッシュに焼き込まれる問題があります。キャッシュ利用サイトでは history.back() か document.referrer(JS)を選んでください。
Q常に特定のページ(一覧など)へ戻したい場合は?
Aリファラを使わず、固定URLをリンクにするか、一覧側のリンクに ?return_url= のようなURLパラメータを付けて詳細ページへ渡し、それを戻るボタンの href に使います(出力時は esc_url() で必ずエスケープ)。

まとめ

  • PHP版wp_get_referer()esc_url() + 存在チェック(同一サイト内のみ返る)
  • キャッシュ利用サイト:PHP版は他人のリファラが焼き込まれるためJS版history.back() / document.referrer)を使う
  • 戻り先が固定:リファラに頼らず固定URLやURLパラメータで

環境(キャッシュの有無)と要件(戻り先が動的か固定か)に合わせて、PHP版・JS版・固定URLを使い分けましょう。