WordPressでGA4 APIを使ったアクセスランキング作成法
PHPの知識はWordPressのテーマを少し触るくらいしかありません。そこで、もう少し難しいことに挑戦したいと思います。現在では無料範囲の生成AIでプログラミングが可能です。AIを先生に学習できたらと思っています。第1弾はGoogle AnalyticsのAPIを使ってアクセスランキングを作ります。
ランキング表示の目標
- データの集計期間は7日間
- 取得するデータは上位6つ
- 1日1回サーバーのcron機能を使ってデータを取得
- データはキャッシュする
試しに30日間のデータを取得したところ、表示されるランキングにはほとんど変化がなく、同じ様に見えるので、少し短めの1週間分を集計します。ページのデザインを考慮し、上位6ページ分のデータを取得します。1日1回サーバーのCronを使ってAPIによりデータを取得し、データをキャッシュしてページに表示します。
ローカル環境で動くものを作る
Google Analytics Data API (GA4)
Google社のサイトを頼りに作業を進めます。Google Analyticsの情報はUAとGA4が混在しておりUAの情報はビューIDを使うものでした。現在使用できるGA4にはビューIDは現在存在しないので、上記のページを元に作業を進めます。
APIを使えるようにする
最初に、Analytics APIを使えるようにします。上記のリンクからたどることもできますが、UAの説明が混ざって分かりにくいので、https://console.cloud.google.com/からの作業のほうが良いかもしれません。
- プロダクトIDの作成
- サービスアカウントの作成
- credentials.jsonの取得
- メールアドレスを作成しAnalyticsとの紐付け
この段階では、APIを使えるようにする事と、credentials.jsonを保存します。
クライアントライブラリをダウンロードする
調べた中ではcomposerを使わずにダウンロードしても使えるとの記載があったので試したところ、ローカルの環境とサーバー環境のどちらもエラーが出て動かなかったので、composerを使ってダウンロードします。今回はpopular_postsフォルダを作ってそこにクライアントライブラリをインストールします。
$ composer require google/analytics-data
上のコードを実行するとエラーがたくさん出ます。composerがインストールされていないようです。同じくbcmathという機能拡張も必要なことから、同じくインストールします。LinuxだとPCに簡単にインストールできますが、それ以外の場合はお使いの環境に合わせて下さい。
コードを変更してデータをキャッシュさせる
例として挙げられているPHPのコードを元にキャッシュできるように変更します。キャッシュする方法はjsonファイルに書き出す方法とデータベースに書き込む方法を考えて作成したのですが、データベースの方はセキュリティを考えてボツとしました。データーベースをWordPress以外のファイルから触る場合のセキュリティに自信がなく、それに比べてファイルの場合はより安全だと考えました。
popular_posts/ga_analytics_api.php
<?php
require 'vendor/autoload.php';
use Google\Analytics\Data\V1beta\Client\BetaAnalyticsDataClient;
use Google\Analytics\Data\V1beta\DateRange;
use Google\Analytics\Data\V1beta\Dimension;
use Google\Analytics\Data\V1beta\Metric;
use Google\Analytics\Data\V1beta\RunReportRequest;
// プロパティIDを設定
$property_id = '**********';
// このスクリプトの絶対パスを取得
$scriptPath = __DIR__;
// 認証情報のJSONファイルの絶対パスを指定
$credentialsPath = $scriptPath . '/credentials.json';
// 認証情報を設定
putenv('GOOGLE_APPLICATION_CREDENTIALS=' . $credentialsPath);
// Analytics Data APIクライアントのインスタンスを作成
$client = new BetaAnalyticsDataClient();
// API呼び出しを行うためのリクエストを作成
$request = (new RunReportRequest())
->setProperty('properties/' . $property_id)
->setDateRanges([
new DateRange([
'start_date' => '7daysAgo',
'end_date' => 'yesterday',
]),
])
->setDimensions([new Dimension([
'name' => 'pagePath',
])])
->setMetrics([new Metric([
'name' => 'screenPageViews',
])])
->setLimit(6); // 結果の数を6に制限
// レポートを実行
$response = $client->runReport($request);
$data = [];
foreach ($response->getRows() as $row) {
$url = $row->getDimensionValues()[0]->getValue();
$pageViews = $row->getMetricValues()[0]->getValue();
$data[] = [
'url' => $url,
'page_views' => $pageViews,
];
}
// 結果をJSONファイルに保存
$json_data = json_encode($data, JSON_PRETTY_PRINT);
file_put_contents(__DIR__.'/ranking_data.json', $json_data);
お使いのGoogle AnalyticsのプロパティIDとcredentials.jsonを設定すると、このga_analytics_api.phpをcronで実行することでranking_data.jsonが保存されます。
ランキングを表示させる
<?php
$ranking_data = home_url('/popular_posts/$ranking_data.json');
$opts = [
'http' => [
'method' => 'GET',
'header' => 'Authorization: Basic ' . base64_encode('idididididid:passpasspass')
]
];
$json_data = file_get_contents($ranking_data , false, stream_context_create($opts));
$data = json_decode($json_data, true);
if ($data === null) {
return;
} else {
$rank = 1;
foreach ($data as $item) {
$url = $item['url'];
$accessCount = $item['page_views'];
$post_id = url_to_postid($url);
$thumbnail = get_the_post_thumbnail($post_id, 'thumbnail');
$title = get_the_title($post_id);
?>
<a href='<?php echo $url; ?>'>
<div><?php echo $title; ?></div>
<p><?php echo $accessCount; ?> views</p>
<div><?php echo $thumbnail; ?></div>
<p><?php echo $rank; ?></p>
</a>
<?php
$rank++;
}
}
?>
ドメイン外のディレクトリにインストールすると、クライアントライブラリが動きませんでした。なにか理由があるのか調べても分からず、試行を繰り返したのですが、結局よく分からずでした。
セキュリティ対策
こうなると外部からのアクセスが可能になってしまうので対策が必要になります。
- popular_postsフォルダにベーシック認証
- cronのベーシック認証からの除外
- 検索ボットに対しpopular_postsフォルダを除外
$opts = [
'http' => [
'method' => 'GET',
'header' => 'Authorization: Basic ' . base64_encode('idididididid:passpasspass')
]
];
popular_postsのベーシック認証のIDをididididididに、passpasspassはパスワードを記入します。私の環境ではベーシック認証でcronが作動しなかったので、サーバーのIPを指定してcronが動くようにします。
Satisfy Any
order deny,allow
deny from all
allow from xxx.xxx.xxx.xxx
popular_postsフォルダにある.htaccessに追記することでcronが動くようになりました。
検索botに覗かないでもらう
Disallow: /popular_posts/
robots.txtにpopular_postsディレクトリを無視するよう記述を加えました。これでローカル環境での行う事前の用意が終了します。次に実際のレンタルサーバーでコードが動くようにします。
レンタルサーバーで動かす
composerを使わずにクライアントライブラリをアップロードしても、正常には動作しませんでした。composerを使うためにはレンタルサーバーとssh通信でつなぐ必要があります。Windowsだとアプリケーションで繋げられるようですがLinuxではコマンドラインを使いました。初めてのことで手間取り、なかなか繋がりませんでした。
レンタルサーバーとのssh通信
私の使っているレンタルサーバーではsshを使うために公開認証用鍵ペアの生成をし、鍵をダウンロードします。おそらく殆どのレンタルサーバーでも同じだと思います。鍵をダウンロードして
ssh -p aa -i bbbbb.key -l cccccc dddd.ne.jp
| aa | ポート |
| bbbbb.key | ダウンロードした公開認証用鍵 |
| cccccc | サーバーID |
| dddd.ne.jp | サーバーアドレス |
上のように入力してもパーミッション関連のエラーがでて繋がりません。調べると公開鍵を新たに作った.sshディレクトリへ移動し、.sshフォルダのパーミッションを700、bbbbb.keyのパーミッションを600に設定すれば繋がりました。
ssh -p aa -i .ssh/bbbbb.key -l cccccc dddd.ne.jp
composerを動かすための準備
やっとのことでcomposerを動かせる段階まで来たら、またもや山盛りのエラーがでました。
- Composerを使おうとするとエラーが出る
- Composerのバージョンが低いのが原因
- Composerのバージョンアップができない
- PHPのバージョンが低いことが原因
- シンボリックリンクを使ってSSH用のPHPのバージョンを上げる
- Composerをアップデート
- Analyticsクライアントライブラリのインストール
上のリストを調べながら進めてやっとクライアントライブラリがインストールされました。ここまで行けば後はローカル環境で作成したファイルをアップロードします。ローカルの環境で動作していれば実際の環境でも動くと思います。
最後までお読みいただき、誠にありがとうございます。
