WordPressで閲覧履歴ページを作る方法

WordPressで閲覧履歴ページを作る方法

WordPress(ワードプレス)で閲覧履歴を表示できるページの作り方を紹介します。今回は投稿やカスタム投稿の詳細ページを閲覧履歴の対象とします。

閲覧履歴ページを作ることで、個人・法人のブログはもちろん、物件情報を扱う不動産サイトなどでも活用することができます。

プラグインは使わず、JavaScriptでCookieを操作することができる「js-cookie」を使用します。
イメージとしては、投稿詳細ページを読み込んだタイミングで投稿情報をCookieに保存し、閲覧履歴ページ(固定ページ)で保存したCookieを取得し、閲覧履歴として投稿を一覧表示させます。

閲覧履歴ページの作り方と手順

投稿情報をCookieに保存

まず「js-cookie」を読み込みます。

<script src="https://cdn.jsdelivr.net/npm/js-cookie@2/src/js.cookie.min.js"></script>

投稿、もしくはカスタム投稿の詳細ページにて、読み込んだタイミングでCookieに投稿情報を保存させます。※ここではカスタム投稿の設定方法などは省略します。

カスタム投稿、店舗情報と仮定して、single-shop.phpを下記では例にしています。

<?php if (have_posts()): ?>
  <?php the_post(); ?>
  <!-- valueとidにそれぞれ投稿IDを設定しています -->
  <div class="single-post" value="<?php the_ID(); ?>" id="history<?php the_ID(); ?>">
    <script type="text/javascript">
      var historyValue = $('.single-post').attr('value');
      var historyId = $('.single-post').attr('id');
      Cookies.set(historyId,historyValue,{expires: 30, path:'/'});
    </script>
    <time><?php the_time('Y.m.d'); ?></time>
    <h1><?php the_title(); ?></h1>
    <?php the_content(); ?>
  </div>
<?php else: ?>
<?php endif; ?>

もう少し細かくコードを見て行きます。

// historyValue にdivタグ「single-post」で設定した「value」を代入します
var historyValue = $('.single-post').attr('value');

// historyId にdivタグ「single-post」で設定した「id」を代入します
var historyId = $('.single-post').attr('id');

// js-cookieを使用したCookieの保存方法です
Cookies.set(historyId,historyValue,{expires: 30, path:'/'});

js-cookieを使用したCookieの保存方法は、下記の通りですが、

Cookies.set('name', 'value')

保存期限を設定するCookieの保存方法もあります。今回は「30」とし、30日間のCookie保存期間で設定しています。

Cookies.set('name', 'value', { expires: 30 })

実装コードでは、nameに「historyId」、valueに「historyValue」を指定しています。本来は特定のnameやvalueを指定しますが、動的なサイトであるWordPressであり、投稿も複数存在するため、変数を活用した形式にしています。

Cookieに保存した投稿情報を取得

<?php
// Cookieを取得
$array = $_COOKIE;
// 取得した配列(Cookie)からキーを取得
$cookies = array_keys($array);
// キーから投稿IDを切り分けて$historyList[]に再格納
foreach($cookies as $post){
  if(strpos($post,'history') !== false){
    $historyId = str_replace('history', '', $value);
    $historyList[] = $historyId;
  } else {
    $historyList[] = 0;
  }
}
?>
<?php
$args = array(
  'post_type' => 'shop', // ここではshopというカスタム投稿を指定
  'post__in' => $historyList, // $historyListに格納した投稿IDを指定
  'posts_per_page' => 6, // ここでは6件表示
);
$the_query = new WP_Query( $args );
?>
<?php if ($the_query->have_posts()): ?>
  <div class="shop-wrapper">
    <?php while($the_query->have_posts()) : $the_query->the_post(); ?>
      <div class="shop-list">
        <h2><?php the_title(); ?></h2>
      </div>
    <?php endwhile; ?>
  </div>
<?php else: ?>
  <p>最近閲覧した店舗はありません。</p>
<?php endif; ?>

取得方法については、js-cookieを使用せず、PHPのCookie取得方法で対応しています。※PHP内で動的にJavaScriptの処理を行う方法が分からなかったため、PHPのみでCookieを取得しました。
もう少しスマートな方法もあるような気がするのですが、今回はこれにてご了承ください。。。

ちなみに通常のjs-cookieでのCookieの取得方法はこちらです。

Cookies.get('name');

その他余談

会員サイトや会員ページはいらないけど、閲覧履歴やお気に入りページは作成してほしいという要望は実際にあります。今回は閲覧履歴ページの作成方法を紹介しましたが、どこかのタイミングでプラグインを使わずにお気に入りページの作成方法を紹介できればと思います。

今回紹介した「js-cookie」に基本的な使い方などはGitHubにて確認することができるので、リンクを貼っておきます。

https://github.com/js-cookie/js-cookie

カテゴリー