blogスタッフブログ
HOME > スタッフブログ > CMS > PowerCMS >PowerCMS XとGoogle Analyticsでランキングを表示

PowerCMS XとGoogle Analyticsでランキングを表示

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>";
}

※入力値のチェックや出力値のエスケープなどに注意しましょう。

蓄積したデータをどう使うかは設計次第でしょうか。独自のタグを作成して毎日指定時間に再構築して公開する、先程のサンプルのように動的に表示させる、色々あると考えています。

最近の記事

カテゴリ

アーカイブ

スタッフ別