CMSで人気ページのランキングを出したいというご要望は多いようです。当社でも昨年11月からPowerCMS Xと組み合わせて試験実装を行っております。2つ方法の実装方法を試していますが、いずれもGoogle AnalyticsのAPIを利用し特定のビューのデータを取得している点は同一です。ちなみにビューは当社の場合、サイト全体のデータが閲覧できるビューとスタッフブログのみが閲覧できるビューを用意しています。
URLモデルにPVを保存
1つ目の方法は、URLモデルにページビューカラムを一つ追加し定期実行処理(worker.phpで実行)にて7日間とか30日間のページビューをページビューカラムに保存する方法です。保存したデータを元に当社スタッフブログのランキングを毎日更新しています。また、PowerCMS Xにログインした後表示されるダッシュボードにも閲覧数の上位を一覧表にして表示させています。
プラグインで拡張しているのはGoogle Analyticsのデータを取得する機能のみで、タグは標準機能を利用しています。とてもシンプルな実現方法と言えるでしょう。
<table class="table table-striped">
<thead>
<tr>
<th>URL</th>
<th>タイトル</th>
<td>PV</td>
</tr>
</thead>
<tbody>
<mt:objectloop model="urlinfo" include_workspaces="all" sort_by="pageview" sort_order="descend" limit="10">
<tr>
<th scope="row"><mt:var name="url" escape /></th>
<td>
<mt:objectloop model="$model" id="$object_id"><mt:var name="title" escape /></mt:objectloop>
</td>
<td><mt:var name="pageview" escape /></td>
</tr>
</mt:objectloop>
</tbody>
</table>
PVを専用モデルに保存
先月、プライベートな時間に試した方法です。ページビューというモデルを新たに作成し、以下のカラムを用意しました。
- 日付
- モデル … index, entry, page, eventのような自作モデルなど
- オブジェクトID … entry_id, page_id, event_idなど
- ページビュー
このモデルに定期実行処理(worker.phpで実行)にて毎日1日分のデータをGoogle AnalyticsのAPIを通じて取得し、データを蓄積していきます。蓄積したデータはPADOを用いて加工した上で表示データにしてみました。昨日・3日間・7日間のページビューを表示できるサンプルでご覧いただけます。
$query = 'SELECT pageview_object_id, entry_title, SUM(pageview_pv) as pv FROM mt_pageview' .
' INNER JOIN mt_entry ON mt_pageview.pageview_object_id = mt_entry.entry_id' .
' WHERE pageview_model = ? AND pageview_date BETWEEN ? AND ?' .
' GROUP BY pageview_object_id' .
' ORDER BY pv DESC' .
' LIMIT 10';
$values = [
'entry',
date( 'Y-m-d 00:00:00', strtotime( "-{$daysAgo} day" ) ),
date( 'Y-m-d 23:59:59', strtotime( '-1 day' ) ),
];
$pageviews = $app->db->model( 'pageview' )->load( $query, $values );
foreach ( $pageviews as $data ) {
echo "<tr><th>{$data->pageview_object_id}</th><th>{$data->entry_title}</th><td>{$data->pv}</td></tr>";
}
※入力値のチェックや出力値のエスケープなどに注意しましょう。
蓄積したデータをどう使うかは設計次第でしょうか。独自のタグを作成して毎日指定時間に再構築して公開する、先程のサンプルのように動的に表示させる、色々あると考えています。
GA4への対応
「PowerCMS XとGoogle Analytics(GA4)でランキングを表示」にまとめましたが対応可能です。