【PHP】リンク(aタグ)のクリック数を取得する方法

リンク(aタグ)のクリック数を PHP でカウントする方法について説明します。
はじめに
PHP でリンクのクリック数をカウントする簡単な方法は2つあります。1つ目は、aタグの href 属性でクリック数カウント用の PHP (例えば view-count.php)に飛ばし、その PHP でクリックを計測後、リンク先へリダイレクトする方法です。もう一つの方法は、aタグに onclick 属性をつけて JavaScript を実行、JavaScript から GET 等で PHP に値を渡し、そのまま JavaScript から location.href でリダイレクトする方法です。
前者の方がシンプルですが、デメリットとして、テーブルの持ち方によってはデータベースとのやり取りが増える場合があること、クリック数カウント用の PHP(例えば view-count.php)まで Google がインデックスしようとすることなどが挙げられます。
今回は、後者の JavaScript (Ajax)を使った方法について説明します。
a タグの設定
aタグは以下のように設定します。
<a href="javascript:void(0);" onclick="ajaxClick(ID, URL)"><!-- 省略 --></a>
onclick で ajaxClick() という関数を実行するようにします。href=”javascript:void(0);” としているのは、href 属性を無効化し、onclick だけ実行されるようにするためです。もはや a タグではなくてボタンでも良いですが、今回は aタグを使用する場合を想定します。
引数として、ID とリンク先 URL を渡していますが、ID は PHP でクリック数カウント用テーブルにアクセスするため、URL は JavaScript の location.href でそのままリダイレクトするためです。このような a タグを出力している時点で、リンク先 URL を含んだテーブルにアクセスしているものと仮定しました。
JavaScript の設置
同じページ内に、以下のような JavaScript の関数を設置します。
function ajaxClick(ID, URL){
const xmlHttp = new XMLHttpRequest();
xmlHttp.open("GET", "viewcount.php?id="+ID);
xmlHttp.send();
location.href=URL;
return false;
}
中身はシンプルで、viewcont.php という PHP ファイルに GET で ID を渡し、引数の URL でリダイレクトしているだけです。viewcont.php という PHP ファイルでクリック数カウント用のテーブルにアクセスし、受け取った ID のクリック数を更新します。
PHP の設置
以下のような PHP を設置します。WordPress 環境を想定していますが、大体こんな感じになるんじゃないかなと思います。
<?php
require_once ('../wp-load.php');
if(!empty($_GET['id'])){
$id = $_GET['id'];
global $wpdb;
if(!is_user_logged_in() && !is_bot()) {
$sql = "SELECT * FROM {$wpdb->prefix}view WHERE ID = %d";
$past_view = $wpdb->get_row($wpdb->prepare($sql, $id));
if($past_view != NULL) {
$temp_view = $past_view->view + 1;
$flag = $wpdb->update('wp_view', ['view' => $temp_view], ['ID' => $id] , ['%d'], ['%d']);
}else{
$flag = $wpdb->insert('wp_view', ['ID' => $id, 'view' => 1], ['%d', '%d']);
}
}
exit;
}else{
wp_safe_redirect(esc_url(home_url()));
exit;
}
function is_bot() {
$ua = $_SERVER['HTTP_USER_AGENT'];
$bot = array(
"Googlebot",
"bingbot"
);
foreach( $bot as $bot ) {
if (stripos( $ua, $bot ) !== false){
return true;
}
}
return false;
}
?>
まず、$_GET[‘id’] が空だったらホームにリダイレクト、そうじゃなければ処理を続行します。次に、閲覧者がログインしている場合と bot の場合を除き、ID の クリック数データがあるか、テーブル(wp_view)を検索します。既にデータがあれば +1 してアップデート、なければその ID のクリック数 1 の 行を追加します。わかりやすくするためにセキュリティ系の記述は省きましたが、$_SERVER[‘HTTP_REFERER’] を確認して、どこのページから流れてきたかも判別しておいたほうが良いと思います。
以上のようにして、aタグのクリック数カウントができました。
少し宣伝
当サイトは WordPress 自作テーマを用いた海外旅ブログまとめサイトとなっています。トップページに地図がありますが、地名を押すと画像が開き、画像を押すと関連記事一覧(クリック数順)が開きます。記事数が多い国ほど赤く、地名もその国で記事が多い都市の文字が大きくなるようにしています。ぜひ覗いてみてください。
当サイトで海外旅ブログを執筆することも可能です(もちろん無料です)! また既にブログをお持ちの方も、当サイトからリンクを貼ることができるようになっています。パントレ開発部までお気軽にお問い合わせください。
このページが皆様のプログラミングの一助となりますことをお祈りいたします
パントレ開発部