WordPress、記事のアクセス数を取得する方法

謎のプリン語る。
プログラミングの役立つ情報とか、どうでもいい雑談とか書いてます。
一人書く人増えました。

WordPress、記事のアクセス数を取得する方法

みやびプリン 500 316

144 144

※この記事は10年以上前の記事です。
現在は状況が異なる可能性がありますのでご注意ください。

どうも、鼻毛に白髪が交じってたみやびです。

冒頭から汚い話ですみません。

さて、タイトルの通り、WordPressの記事のアクセス数を取得する方法です。
しかもプラグインなしでです。(←ここ重要)

まぁ、なんでプラグインなしというと、
今回使ったサーバーのPHPが古くて、下記プラグインが使えなかったからだ。

●WordPress Popular Posts
http://wordpress.org/plugins/wordpress-popular-posts/

そんなこんなでいたしかたなく自分でスクリプトを書いたのである。
このプラグイン使えたらこんなに苦労しなかった。

さて本題。
まず、カウンタ用のカスタムフィールドを用意する。
(カスタムフィールドなのは、記事ランキングなどを生成しやすくするため)

①WordPress管理画面から、
投稿 > 新規追加 と行って、記事編集画面へ。

②記事編集画面右上の、表示オプションをクリックして開き、
カスタムフィールドにチェックする

③画面下のカスタムフィールド枠の中の"新規追加"リンクを押す。

④名前に、適当に英数字でカスタムフィールド名を入れる。
(今回はviews)

⑤その下のカスタムフィールドを追加ボタンを押す

以上で準備は完了だ。

そして、今度はテンプレート内から、
WordPressのデータベースに直接アクセスし、様々な処理を行う。

テーマの中の、single.phpにて下記スクリプトを記載すると、
カスタムフィールドの値をとってくることができる。

global $wpdb;       //データベースへの接続準備
$query = $wpdb->get_results("
 SELECT *
 FROM $wpdb->postmeta
 WHERE post_id= $post->ID
 AND meta_key='views'          //カスタムフィールド名を入れる
");

foreach ($query as $value) {
 $viewsCount = $value->meta_value;
 echo $viewsCount;
}

あとは簡単で、取ってきた値に+1をし、
dbのテーブルの値に入れてやればいい。

foreachの部分を下記に変更するとできる。

foreach ($query as $value) {
 $viewsCount = $value->meta_value;
 $viewsCountP = $viewsCount+1;
 $wpdb->query("
  UPDATE wp_postmeta
  SET meta_value = $viewsCountP
  WHERE post_id= $post->ID
  AND meta_key = 'views'
 ");
}

こうすれば、記事を表示するたびに、
カスタムフィールドの値が増えていき、
アクセス数がカウントされるわけだ。

だが、このままでは、二重カウントされてしまう。
そこで、SESSION関数を使って、24時間は二重カウントされないようにする。

session_start();

if (!isset($_SESSION["visited"])){          //SESSIONの"visited"がなければ実行

 $_SESSION["visited"] = true;     //SESSIONの"visited"に値をいれる。
 $_SESSION["date"] = date('Y-m-d H:i:s');     //SESSIONの"date"にアクセスした日時を入れる

 global $wpdb;
 $query = $wpdb->get_results("
  SELECT *
  FROM $wpdb->postmeta
  WHERE post_id= $post->ID
  AND meta_key='views'
 ");

 foreach ($query as $value) {
  $viewsCount = $value->meta_value;
  $viewsCountP = $viewsCount+1;
  $wpdb->query("
   UPDATE wp_postmeta
   SET meta_value = $viewsCountP
   WHERE post_id= $post->ID
   AND meta_key = 'views'
  ");
 }

} else {

 $onday = strtotime(date('Y-m-d H:i:s'));     //strtotimeを使い、現在時刻を四則計算できる数字に変換
 $getday = strtotime($_SESSION["date"]);     //strtotimeを使い、SESSIONに入った初期アクセスの時間を四則計算できる数字に変換

 $SecondDiff = abs($onday - $getday);     //現在時刻 - 初期アクセス時刻をし、何時間経ったかを取得

 $DayDiff = $SecondDiff / (60 * 60);     //時間単位に変換

 if($DayDiff >= 24){     //24時間経ってたら実行
  unset($_SESSION["visited"]);     //SESSIONの"visited"を削除
  unset($_SESSION["date"]);     //SESSIONの"date"を削除
 }

}

初回アクセスの時だけ、カウントを実行し、
そして、時間をSESSIONに入れておき、
そいつと、次のアクセス時間を比べ、24時間以上経っていたら、
SESSIONを消す、といったことをしている。
SESSIONが消えれば再びカウント~といった流れ。

こうしとけば、1日間は二重カウントされない。

そして、ランキングの一覧だが、カウント用のカスタムフィールドの値から、記事一覧を取得する。

sidebar.php等に下記スクリプトを記述する。

<?php
query_posts('posts_per_page=9&meta_key=views&orderby=meta_value_num');
$i = 1;
while ( have_posts() ) : the_post(); ?>

~各処理と表示~

<?php $i++; endwhile; ?>

これをいれると、記事のカウントが多い順に記事一覧を生成できる。
"$i"を定義しているのは、記事の順番によって分岐させるため。
whileの直前で、$iの値を増やしているのはそのため。

あとは、各処理と表示のところで、WordPressの記事のタイトルとかを入れていけばいい。

しかし、今回は手探りでやったから、もっといい方法あるかも。
もっとスマートな書き方とかあれば教えてください。

ではまた

トラックバック(0)

トラックバックURL:

コメントする

ページトップへ戻る