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);
閲覧履歴がある場合
- HTMLの
<ul>
タグでリストを作成します。 url_to_postid($page)
を使って、ページURLから投稿IDを取得します。投稿IDが存在する場合、以下の情報を取得します。- サムネイル画像(
get_the_post_thumbnail
)をリンク付きで取得し、<a>
タグで囲みます。 - タイトル(
get_the_title
)をリンク付きの<p>
タグで囲みます。
- サムネイル画像(
- 各履歴項目を
<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]
ショートコードを登録します。このショートコードを使うことで、任意のページや投稿にユーザーの閲覧履歴を表示できるようになります。