WordPressで会員制サイトや学習サイトを運営していると、ユーザーが「前回どのページを閲覧したか」を知りたい場面があります。この記事では、ログイン中のユーザーが最後に閲覧した投稿を保存し、次回ログイン時に表示する仕組みを実装します。
最後に閲覧した投稿のIDを記録する処理
以下のコードをfunctions.phpに追加してください。投稿ページが表示されたときに、ログイン中のユーザーに対して投稿IDを記録します。
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が保存されます。
保存された投稿を取得して表示する方法
次に、保存された投稿を取得して、ユーザーに表示する処理を実装します。以下の関数を任意のテンプレート(例:サイドバー、ダッシュボードなど)に追加します。
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 ($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>';
}
}
}
この関数は、ログイン中のユーザーにだけ表示され、前回閲覧した記事へのリンクを表示します。
ウィジェットやショートコード化するには?
この機能をウィジェットやショートコードとして使いたい場合は、以下のようにショートコード化できます。
// ショートコードで出力
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. 最近見た記事を一覧ウィジェットで表示するには?
A. get_user_meta($user_id, ‘recent_posts’, true)で記事IDリストを取得し、WP_Queryのpost__inとorderby=post__inで表示順を維持しながらループ表示します。
Q. ログアウトしても最近見た記事を維持するには?
A. Cookieに記事IDリストを保存します。ログイン時にCookieの値をDB(user_meta)にマージして統合します。非ログイン時はCookieのみ、ログイン後はDBを使う構成です。
まとめ
ログインユーザーの最後に閲覧した投稿を記録・表示することで、ユーザー体験を向上させることができます。特に、学習コンテンツ、レビュー記事、マイページ型サイトなどで活用価値が高い機能です。WordPressのユーザーメタと条件分岐を組み合わせることで、簡単に実装できます。

