サイトを訪れた人自身がそのサイトの閲覧履歴をチェックしたい

サイトを訪れた人自身がそのサイトの閲覧履歴をチェックしたい

WordPressで構築されたウェブサイトを閲覧している人が…

わたしはこのサイトでどの記事を読んだかしら?

なんて思ったときに「閲覧履歴」のページがあると便利です。

目次

function.php

function.phpに以下の記述をすることでWordPressサイトでユーザーの閲覧履歴をクッキーに保存し、その履歴を表示するための関数を定義します。

function record_user_history_with_cookies() {
    if (is_home() || is_front_page() || is_page() || is_category() || is_tag() || is_author() || is_archive()) {
        return; // 指定したページタイプを除外
    }

    // 現在のページURLを取得
    $current_page = get_permalink();

    // クッキーから現在の閲覧履歴を取得
    if (isset($_COOKIE['user_history'])) {
        $history = json_decode(stripslashes($_COOKIE['user_history']), true);
    } else {
        $history = array();
    }

    // 重複したページを記録しないようにする
    if (!in_array($current_page, $history)) {
        $history[] = $current_page;

        // クッキーに更新された履歴を保存
        setcookie('user_history', json_encode($history), time() + 3600 * 24 * 30, '/'); // 30日間有効
    }
}
add_action('wp', 'record_user_history_with_cookies');

function display_user_history_with_cookies() {
    if (isset($_COOKIE['user_history'])) {
        $history = json_decode(stripslashes($_COOKIE['user_history']), true);

        if (!empty($history)) {
            $output = '<section>';
            foreach ($history as $page) {
                $post_id = url_to_postid($page);
                if ($post_id) {
                    $thumbnail = '<a href="' . esc_url($page) . '">' . get_the_post_thumbnail($post_id, 'thumbnail', array('style' => 'width:100px;height:auto;')) . '</a>';
                    $title = '<p><a href="' . esc_url($page) . '">' . esc_html(get_the_title($post_id)) . '</a></p>';
                    $output .= '<div>' . $thumbnail . $title . '</div>';
                }
            }
            $output .= '</section>';
            return $output;
        } else {
            return '閲覧履歴はありません。';
        }
    } else {
        return '閲覧履歴はありません。';
    }
}
add_shortcode('user_history', 'display_user_history_with_cookies');

閲覧履歴ページの作成

固定ページを作成しタイトルに「閲覧履歴」と入力し本文に以下のショートコードを記述します。

[user_history]

説明

閲覧履歴を記録

特定のページタイプを除外

どの記事を閲覧したかを確認したいのでトップページやカテゴリー、アーカイブなどは閲覧したページから除外したいです。そこでis_home(), is_front_page(), is_page(), is_category(), is_tag(), is_author(), is_archive()関数を使って、ホームページやフロントページ、固定ページ、カテゴリーページ、タグページ、著者ページ、アーカイブページを除外しています。これらのページは閲覧履歴に記録しないようにしています。

// ホームページ、フロントページ、固定ページ、カテゴリーページ、タグページ、著者ページ、アーカイブページを除外
if (is_home() || is_front_page() || is_page() || is_category() || is_tag() || is_author() || is_archive()) {
    return; // 指定したページタイプを除外

現在のページURLを取得

get_permalink()関数を使って、現在のページのURLを取得します。

// 現在のページURLを取得
$current_page = get_permalink();

クッキーから現在の閲覧履歴を取得

$_COOKIE['user_history']をチェックし、存在すればその値を取得してJSONデコードします。クッキーが存在しない場合は空の配列を初期化します。

// クッキーから現在の閲覧履歴を取得
if (isset($_COOKIE['user_history'])) {
    $history = json_decode(stripslashes($_COOKIE['user_history']), true);
} else {
    $history = array();
}

重複しないようにページを記録

in_array($current_page, $history)で、現在のページが既に履歴に含まれているかをチェックし、含まれていなければ履歴に追加します。

// 重複したページを記録しないようにする
if (!in_array($current_page, $history)) {
    $history[] = $current_page;

クッキーに更新された履歴を保存

setcookie関数を使って、更新された履歴をクッキーに保存します。クッキーは30日間有効です。

// クッキーに更新された履歴を保存
    setcookie('user_history', json_encode($history), time() + 3600 * 24 * 30, '/'); // 30日間有効

閲覧履歴を表示

クッキーから閲覧履歴を取得

$_COOKIE['user_history']をチェックし、存在すればその値を取得してJSONデコードします。

if (isset($_COOKIE['user_history'])) {
    $history = json_decode(stripslashes($_COOKIE['user_history']), true);

閲覧履歴がある場合

  1. HTMLの<ul>タグでリストを作成します。
  2. url_to_postid($page)を使って、ページURLから投稿IDを取得します。投稿IDが存在する場合、以下の情報を取得します。
    • サムネイル画像(get_the_post_thumbnail)をリンク付きで取得し、<a>タグで囲みます。
    • タイトル(get_the_title)をリンク付きの<p>タグで囲みます。
  3. 各履歴項目を<li>タグでリストアイテムとして追加します。
if (!empty($history)) {
    $output = '<section>';
    foreach ($history as $page) {
        $post_id = url_to_postid($page);
        if ($post_id) {
            $thumbnail = '<a href="' . esc_url($page) . '">' . get_the_post_thumbnail($post_id, 'thumbnail', array('style' => 'width:100px;height:auto;')) . '</a>';
            $title = '<p><a href="' . esc_url($page) . '">' . esc_html(get_the_title($post_id)) . '</a></p>';
            $output .= '<div>' . $thumbnail . $title . '</div>';
        }
    }
    $output .= '</section>';
    return $output;

ショートコードの追加

add_shortcode関数を使って、[user_history]ショートコードを登録します。このショートコードを使うことで、任意のページや投稿にユーザーの閲覧履歴を表示できるようになります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

初めてホームページを作成したのは1996年。
2000年よりフリーランスで主に中小企業、学校、各種公的団体、個人事業主のWordPressを活用したホームページ制作を行っています。WordPressテーマはそれぞれのクライアントに合わせて作成しています。
WordPressを活用したサイト運営のための情報発信をしていきます。

目次