【WordPress】ログイン中のユーザーが最後に閲覧した投稿を記録・再表示する方法

【WordPress】ログイン中のユーザーが最後に閲覧した投稿を記録・再表示する方法 WordPress

WordPressで会員制サイトや学習サイトを運営していると、ユーザーが「前回どのページを閲覧したか」を知りたい場面があります。この記事では、ログイン中のユーザーが最後に閲覧した投稿を保存し、次回ログイン時に表示する仕組みを実装します。

クライアント側の実装で全訪問者を対象にしたい場合は、プラグインなしで「最近見た記事」機能を実装する方法|localStorageでキャッシュ完全対応もあわせてご覧ください。本記事はログインユーザー限定でサーバー側(user_meta)に保存する方式を扱います。

スポンサーリンク

最後に閲覧した投稿のIDを記録する処理

以下のコードをfunctions.phpに追加してください。投稿ページが表示されたときに、ログイン中のユーザーに対して投稿IDを記録します。

functions.php:最後に閲覧した投稿の記録
function save_last_viewed_post() {
  if (is_single() && is_user_logged_in()) {
    $user_id = get_current_user_id();
    update_user_meta($user_id, 'last_viewed_post_id', get_the_ID());
  }
}
add_action('wp', 'save_last_viewed_post');

この処理は、投稿ページが表示された際に実行され、ユーザーメタにlast_viewed_post_idというキーで投稿IDが保存されます。

保存された投稿を取得して表示する方法

次に、保存された投稿を取得して、ユーザーに表示する処理を実装します。以下の関数を任意のテンプレート(例:サイドバー、ダッシュボードなど)に追加します。

functions.php:前回閲覧した投稿の表示
function display_last_viewed_post() {
  if (!is_user_logged_in()) return;

  $user_id = get_current_user_id();
  $last_post_id = get_user_meta($user_id, 'last_viewed_post_id', true);

  // 現在閲覧中の投稿自身を「前回閲覧した記事」として表示しないようにする
  if (is_singular() && (int) $last_post_id === get_the_ID()) {
    return;
  }

  if ($last_post_id) {
    $post = get_post($last_post_id);
    if ($post && $post->post_status === 'publish') {
      echo '<div class="last-viewed-post">';
      echo '<h3>前回閲覧した記事</h3>';
      echo '<a href="' . esc_url(get_permalink($post)) . '">' . esc_html(get_the_title($post)) . '</a>';
      echo '</div>';
    }
  }
}
サイドバーに置くと現在の記事自身を表示してしまう
多くのテーマでは、サイドバーが投稿ページ自体にも表示されます。save_last_viewed_post()はページ描画より前の’wp’アクションで発火するため、投稿Aを開いた瞬間にlast_viewed_post_idがAへ更新され、その直後に同じページ内で表示される「前回閲覧した記事」欄がAそのもの(今まさに見ているページ)を指してしまいます。上記コードのように、現在閲覧中の投稿と一致する場合は表示をスキップするガードを入れておきましょう。

この関数は、ログイン中のユーザーにだけ表示され、前回閲覧した記事へのリンクを表示します。

ウィジェットやショートコード化するには?

この機能をウィジェットやショートコードとして使いたい場合は、以下のようにショートコード化できます。

functions.php:ショートコード化
// ショートコードで出力
function shortcode_last_viewed_post() {
  ob_start();
  display_last_viewed_post();
  return ob_get_clean();
}
add_shortcode('last_viewed_post', 'shortcode_last_viewed_post');

投稿本文やウィジェットに[last_viewed_post]と記述することで、前回の閲覧投稿リンクを表示できます。

よくある質問(FAQ)

Qログインユーザーの最近見た記事をDBに保存するには?
A記事閲覧時にupdate_user_meta()でシリアライズした記事IDリストを保存します。最大件数を超えた場合は古いIDを削除します。DBへの書き込みは頻繁になるためTransients APIとの組み合わせも検討します。
Q最近見た記事を一覧ウィジェットで表示するには?
Aget_user_meta($user_id, ‘recent_posts’, true)で記事IDリストを取得し、WP_Queryのpost__inとorderby=post__inで表示順を維持しながらループ表示します。
Qログアウトしても最近見た記事を維持するには?
ACookieに記事IDリストを保存します。ログイン時にCookieの値をDB(user_meta)にマージして統合します。非ログイン時はCookieのみ、ログイン後はDBを使う構成です。

まとめ

ログインユーザーの最後に閲覧した投稿を記録・表示することで、ユーザー体験を向上させることができます。特に、学習コンテンツ、レビュー記事、マイページ型サイトなどで活用価値が高い機能です。WordPressのユーザーメタと条件分岐を組み合わせることで、簡単に実装できます。サイドバーなど投稿ページ自体にも表示する場合は、自己参照を避けるガードを忘れないようにしましょう。