2020/04/29 16:34
Wordpress(PHP)でユーザー毎の「閲覧履歴」をデータベース連携して作成&表示する方法
「閲覧履歴」を残す方法はCOOKIEを使ったり、データベース(DB)に記憶させたりいろんなやり方があります。
今回はWordpressでDBを使った履歴の残し方を説明します。
今回説明する方法は「ユーザー毎」の閲覧履歴となります。
つまり、ユーザー名とパスでWPサイトにログインした状態で閲覧した履歴の操作方法となります。
①DBに新しい項目を追加する
「ユーザーメタ」と呼ばれるパラメーターがあるのですが、そこへまずは「閲覧履歴」の項目を追加します。
情報を入れる箱を作る訳です。
今回そのDBに記憶させるのは「投稿記事個別ページのページID」を配列でどんどん入れていくという簡単なやり方のご紹介です。
まずはfunctions.phpへの追記が必要となります↓
「functions.php」
// ユーザープロフィールの項目のカスタマイズ
function my_user_meta($wb)
{
//項目の追加
$wb['user_history'] = '閲覧履歴';
return $wb;
}
add_filter('user_contactmethods', 'my_user_meta', 10, 1);
// 閲覧履歴を取得
add_action( 'get_header', 'set_hitory');
function set_hitory() {
global $history;
global $postid;
$history = null;
$set_this_ID = null;
$userID = get_current_user_id();
$postid = get_the_ID();
// 呼び出し
$history = get_the_author_meta('user_history', $userID);
}
これを記載する事によって管理画面の「ユーザーページ」に「閲覧履歴」の項目が追加されます。
さらに閲覧履歴を取得する為の記述も書いてあります。
これが「投稿記事個別ページのページID」の配列です。
情報が入った後の状態がこのようになる訳です。
ちなみに「phpMyAdmin」とかに入って操作する必要もありません。
取り合えずファンクションへの記述のみで大丈夫です。
②閲覧履歴を取得
次に早速ですが、投稿記事個別ページへ遷移した時に「ページID」を取得して、DBへと記憶させる作業です。
これもfunction.phpへ記載するか、投稿記事個別ページ内へ書いておけば良いかと思います。
「single.php」
<?php
global $history;
global $postid;
$history = null;
$set_this_ID = null;
$userID = get_current_user_id(); //自身のユーザーID取得
$postid = get_the_ID();
//記事投稿ページならページID取得&DB書き込み
if(is_single()) { //もしカスタム投稿ならis_singular('カスタム投稿名')
// 存在する場合DBお気に入りの値を呼び出し
$history = explode(',', get_the_author_meta('user_history', $userID));
// IDの登録が16個以上あったら15個までになるよう削除
if(count($history) >= 16 ){
$set_history = array_slice($history , 0, 15);
} else {
$set_history = $history;
}
// 既に投稿IDがお気に入りに存在しない場合は追加
if (in_array($postid, $history)) {
} else {
// DBにある現在の記事IDを削除(順番整理&表示除外用)
$history = array_diff($history, array($postid));
$history = array_values($history);
$set_this_ID_history = $postid.','.implode(',', $set_history);
update_user_meta( $userID, 'user_history', $set_this_ID_history);
}
// 呼び出し
$history = get_the_author_meta('user_history', $userID);
} else {
// 呼び出し
$history = get_the_author_meta('user_history', $userID);
}
?>
これで記事個別ページへアクセスした時に自動で「閲覧履歴」としてメタデータへカンマ区切りで追加されていきます。
【流れ】
これで「もし投稿記事個別ページだったら」という始まり方でスタートして
↓
「自分のユーザーIDを取得」
↓
「投稿記事個別ページのページIDを取得」
↓
「DB内に既にページIDがあるかどうか判断」
↓
「あれば何もしない」
↓
「なければIDをカンマ区切りで追加してく」
…という作業が行われます。
追加に関しては終わりです。
③履歴の表示
次に表示方法の説明です。
DBに入れた配列のID達をどうやってループで回して表示させればいいのか。
まずは閲覧履歴を表示させる為のページを作成します。
今回の場合はサイドバーに「最近見た店舗」みたいな感じで付けて、後はタブとかで見れるようなサンプルにしました。
で、どうやってDBから引っ張って表示させたのかっていうコードがこちら↓
「page-history.php」
<h1>
閲覧履歴デモページ
</h1>
<?php
global $history;
$history = null;
$arr_history = null;
$userID = get_current_user_id();
$history = get_the_author_meta('user_history', $userID);
$arr_history = explode(',', $history);
?>
<?php if (!empty($history)):?>
<div>
<?php
$args = array(
'post_type' => 'post',
'posts_per_page' => -1,
'post__in' => $arr_history,
'orderby' => 'post__in',
);
$the_query = new WP_Query($args);
$found_posts = $the_query->found_posts; //全件の数取得
if ( $the_query->have_posts()) :?>
<?php while ( $the_query->have_posts()) : $the_query->the_post();?>
ループ表示させる記事内容
<?php endwhile;?>
<?php endif; wp_reset_postdata();?>
</div>
<?php endif;?>
<p>全<?php echo $found_posts;?>件</p>
こんな感じで、DBから情報を引っ張ってきて、配列のIDを全件ループさせて表示させます。
下記はデモページの例です。
ついでに履歴削除ボタンもつけてます。
では削除方法も見ていきましょう。
④閲覧履歴の削除
閲覧履歴の削除ボタンをつけて、それが押された場合に全件を削除する方法です。
例えば削除用のボタンはこんな感じでformで作る↓
<form action="" method="post">
<input type="submit" name="delhistoryall" value="閲覧履歴を全て削除">
</form>
で、ボタンをつけたら、これが押された時に反応するコードを書く↓
<?php
// 閲覧履歴削除 ----------------------------------------
if(isset($_POST['delhistoryall'])) {
//自身のユーザーID取得
$userID = get_current_user_id();
//DBお気に入り内に登録
update_user_meta( $userID, 'user_history', '');
}
$history = get_the_author_meta('user_history', $userID);
?>
これだけでDB内を空っぽにできます。
まとめ
簡単にまとめると作成フローはこんな感じですね。
・DBに箱を作る
・配列で個別ページIDが数字で入るようにする
後は操作する為の記述なんかを書いていけば自由に操作可能という事です。
ざっくり大まかな説明となりますが、DBに閲覧履歴等を残していく実装方法でした。
DEMO PAGE : https://phper.pro/demo_history
現場から以上です!
9450