こんにちは!慣れないウェブ開発に日々悪戦苦闘するimagineです。
今日はシングルページにビュー数を表示したいと思い、色々調べたのでこちらにメモしておきます。
WordPressであれば、プラグインを有効化をポチれば一発で終わるけど、Laravelだとどうやってビュー数を表示するのだろうかと考え、実装してみました。
まず、ふたつの方法を考えました。
自前のビュー数データをつくってしまう!
これがめちゃくちゃシンプルかつ簡単だと思ったので思わず手が出てしまいそうでしたが、毎回ページを表示するごとにデータベースに書き込みに行くのは、ちょっとというかかなりイケてない気がしたので、我慢。
この方法で実装するとしたら、コントローラのshowのところでデータを取りに行って、1足して、書き込みに行って表示するという感じなのかなあ。
GA(Google Analytics)から取ってくる!
今時ほとんどのサイトでGoogle Analyticsは使われてると思います。知らんけど。
もちろん私がいま開発中のサイトでも使用しています。
せっかくGAがview数とかカウントしてくれてるのに、わざわざ自分でカウントし直すのはあほらしい!データくれ!と思って調べると方法がありそうでした。
手順
❶ライブラリをインストール
https://github.com/spatie/laravel-analytics
まずこちら↑をインストールします。
composerをご使用のかたは
composer require spatie/laravel-analytics
でインストール可能です。
ほんでapp.phpに
config/app.php
‘providers’ => [
Spatie\Analytics\AnalyticsServiceProvider::class, これ追加!
];
と
config/app.php
‘aliases’ => [
‘Analytics’ => Spatie\Analytics\AnalyticsFacade::class, これ追加!
];
を追記します。
これでLaravel側のセットアップはおっけーです。
❷ Google APIを準備する!
Google API’s siteにアクセスして、Google AnalyticsのAPIを準備いたします。
左上のロゴの右隣をクリックして使用したいプロジェクトを選択します。
まだプロジェクトがない場合は作成しちゃってください。
プロジェクトを選択(or 作成)するとダッシュボードページにいけるはずです。
その左サイドバーがこんな感じ。
この左サイドバーでサービスアカウントをクリックして、その先で「サービスアカウントを作成」をクリックしてください。
こんな感じで進めてください。サービスアカウント名とIDは他と被らなければ多分オッケーです。
保存をするとjsonファイルがパソコンに保存されると思います。
そして左上のGoogleAPIsのロゴをクリックしてホームに戻り、
こんなボタンをみつけてもらって、クリック!
Google Analytics Reporting APIを検索してください。
Analyticsとか打てば出ます。
ほんで有効化しちゃってください。
次にAnalytics側のほうで設定を進めていきます。
まずいつも通りGoogleAnalyticsの管理画面にアクセスします。
管理画面の左下にある管理ボタンをクリック。
ビュー項目の中の ビューの設定 をクリック。そこにあるビューIDをコピーしておいてください。あとで使います。
次にこれまたビュー項目にあるユーザー管理者をクリック。
こちらの右上に丸っこいプラスマークがあるのでそちらから権限を追加します。
メールアドレス部分には先ほどダウンロードしたjsonファイルを開き、”client_email” のバリューをコピーして貼り付けちゃいましょう。
権限は表示と分析でいいかと思います。
できたら、追加!!!
❸ jsonファイルをLaravelプロジェクトに追加する!
先ほどGoogleAPIでダウンロードしたjsonファイルをLaravelに追加します。
追加場所は、ここでいいかな。storageのほうのappディレクトリにanalyticsフォルダをつくり、その中に先ほどのjsonファイルを保存します。ファイル名は、service-account-credentials.jsonにしておきます。
/storage/app/analytics/
❹ ライブラリ用のconfigファイルを作成する!
php artisan vendor:publish –provider=“Spatie\Analytics\AnalyticsServiceProvider“
これでいけるはず。
こんな内容↓のファイルがconfig/analytics.phpにできていることを確認してください。
<?php
return [
/*
* The view id of which you want to display data.
*/
‘view_id’ => env(‘ANALYTICS_VIEW_ID’),
/*
* Path to the client secret json file. Take a look at the README of this package
* to learn how to get this file. You can also pass the credentials as an array
* instead of a file path.
*/
‘service_account_credentials_json’ => storage_path(‘app/analytics/service-account-credentials.json’),
/*
* The amount of minutes the Google API responses will be cached.
* If you set this to zero, the responses won’t be cached at all.
*/
‘cache_lifetime_in_minutes’ => 60 * 24,
/*
* Here you may configure the “store” that the underlying Google_Client will
* use to store it’s data. You may also add extra parameters that will
* be passed on setCacheConfig (see docs for google-api-php-client).
*
* Optional parameters: “lifetime”, “prefix”
*/
‘cache’ => [
‘store’ => ‘file’,
],
];
❺ .envファイルにビューIDを追加!
ANALYTICS_VIEW_ID=123456789
先ほどGoogleAnalyticsでコピーしたビューIDをenvファイルにペーストしてください。
ここまでできたらおそらくデータが取ってこれる状態になっているはず。
❻ コントローラ内で実際にデータを取ってこよう!
$limit = 8;
$pages = Analytics::fetchMostVisitedPages(Period::days(7), $limit);
さっそくですがこれで7日間でもっとも人気なページ8件のデータを取ってくることができます。
use Analytics;
use Spatie\Analytics\Period;
コントローラの一番上にuseを追記することも忘れずに!
上記の$pagesをdd()してみると
こんな感じのデータが取れてました。
このデータを使えば期間を指定した人気記事が取れるので、全期間のランキングに比べて動的な人気記事ランキング的なものも作れそうですね!一応注意点としてはトップページも含まれてしまっているので、こちらを省かなくてはいけません。
簡単な方法は多めに取ってきて、urlをセパレートしてトップページなどの固定ページをブロックしちゃう。
もう一つは試してないけど、多分うまくクエリをかければ固定ページ以外だけを取ってこれるはずです。
他にもいくつかのメソッドが用意されています。
https://github.com/spatie/laravel-analytics#provided-methods
でも!私が今回したかったのは、それぞれのシングルページにビュー数を表示したかった!
そのためには人気の記事とかじゃなくて、URLで指定したページのビュー数を返して欲しかった!
なので少し工夫が必要でした。多分今回の場合は、先ほどのメソッド一覧の最後、otherに含まれるのだろうということで performQueryメソッドで頑張ります。
調べてみるとめちゃくちゃいろんなことが指定できそうです。
https://developers.google.com/analytics/devguides/reporting/core/v3/common-queries
いろんなの紹介しているとキリがなさそうなので、今回の
シングルページのビュー数を取得したい!
場合の方法を記載しておきます。
use Analytics;
use Spatie\Analytics\Period;
をcontrollerのトップに記載していることを確認して、
$metrics = ‘ga:pageviews’;
$analytics = Analytics::performQuery(Period::years(1), $metrics, $others = array(‘filters’ => ‘ga:pagePath==/pages/’ . $id, ‘dimensions’ => ‘ga:pagePath’));
$views = $analytics -> rows[0][1];
これで$viewsに ‘/pages/’ . $id パスのビュー数が入りました。
ちなみにPeriod::years(1)にある通り、私は過去1年間のビュー数を取得しています。
days()とかでもいけます。私の場合は累計が欲しかったのですが、いい方法が見つからず、とりあえず1年でいっかということにしています。良い方法があったら教えてください…
こちらをviewに渡して表示すれば念願のシングルページにビュー数表示の完成です!

それでは、お疲れ様でした。
imagine