スタッフブログ Staff Blog

Google Analytics APIでサイト内のアクセスランキングを実装(1)

Google Analyticsを導入しているサイトで、Google Analyticsのデータを利用してサイト内のアクセスランキングを実装する方法をご紹介します。

ランキングを取得するための事前準備

Google API Consoleでの設定

  • Google API Consoleでプロジェクトを作成します
  • API ライブラリからAnalytics APIを探して有効にします。
  • 認証情報からサービスアカウントを作成してJSONを取得します。
  • サービスアカウントを作成すると自動的にメールアドレスが作成されます。

Google Analyticsでの設定

  • ランキングを取得するビューのユーザー管理者に上記で作成したサービスアカウントのメールアドレスを追加します。
  • 後述する特定のページを対象としたランキングにしたい場合はカスタム定義からカスタムディメンションを作成しておきます。

PHPライブラリのインストール

Composerでインストールするか

{
  "require": {
    "google/apiclient": "2.*"
  }
}

google/google-api-php-clientからダウンロードして設置します。

アクセス順にランキングを取得する

今回は以下の実装でアクセス順のランキングを取得します。

ランキングのJSONを返すPHPの実装

期間を指定してアクセス順のランキングをJSONで返すPHPコードを実装します。
以下のPHPを「start」と「end」パラメータで期間を指定して実行すると、指定期間のランキングJSONを取得します。

例) 直近1週間のランキングを取得する場合
example.php/?start=2018-07-23&end=2018-07-30

header("Content-Type: application/json; charset=UTF-8");

// ライブラリのパス
require_once 'vendor/autoload.php';
// サービスアカウントを作成した際に取得したJSONのパス
define('KEY_FILE_LOCATION', 'json/auth.json');
// Google AnalyticsのビューID
define('VIEW_ID', 'xxxxxxxxx');

$analytics = initAnalytics();
getPageviewsRanking($analytics, VIEW_ID);

function initAnalytics() {
  $client = new Google_Client();
  $client->setApplicationName('Analytics Reporting');
  $client->setAuthConfig(KEY_FILE_LOCATION);
  $client->setScopes(['https://www.googleapis.com/auth/analytics.readonly']);
  $analytics = new Google_Service_Analytics($client);
  return $analytics;
}

function getPageviewsRanking($analytics) {
  $json = array(
    'status' => '',
    'message' => '',
    'data' => array()
  );
  $start = isset($_GET['start']) ? htmlspecialchars($_GET['start'], ENT_QUOTES) : '';
  $end = isset($_GET['end']) ? htmlspecialchars($_GET['end'], ENT_QUOTES) : '';
  $is_error = false;
  $error_message = '';

  if (empty($start) || empty($end)) {
    $is_error = true;
    $error_message = 'パラメータが指定されていません。start/endを指定してください。';
  } else if (!strptime($start, '%Y-%m-%d') || !strptime($end, '%Y-%m-%d')) {
    $is_error = true;
    $error_message = 'パラメータの指定が正しくありません。start/endをYYYY-mm-ddの形式で指定してください。';
  }

  if (!$is_error) {
    $results = $analytics->data_ga->get(
      'ga:' . VIEW_ID,
      $start,
      $end,
      'ga:pageviews',
      array(
        'dimensions' => urlencode('ga:dimension1,ga:dimension2,ga:dimension3'),
        'sort' => urlencode('-ga:pageviews'),
        'max-results' => '10'
      )
    );

    if (count($results->getRows()) > 0) {
      $rows = $results->getRows();
      foreach ($rows as $row) {
        $title = isset($row[1]) ? $row[1] : '';
        $url = isset($row[2]) ? $row[2] : '';
        $pv = isset($row[3]) ? $row[3] : '';

        if (isset($title)) {
          $entry = array(
            'title' => $title,
            'url' => $url,
            'pv' => $pv
          );
          $json['data'][] = $entry;
          if (count($json['data']) === 10) {
            break;
          }
        }
      }
      if (isset($json['data']) && count($json['data']) > 0) {
        $json['status'] = 'success';
        echo json_encode($json);
      } else {
        $is_error = true;
        $error_message = '指定期間内のランキングがありません。';
      }
    } else {
      $is_error = true;
      $error_message = '指定期間内のランキングがありません。';
    }
  }

  if ($is_error) {
    $json['status'] = 'error';
    $json['message'] = $error_message;
    die(json_encode($json));
  }
}

なお、サンプルコードでは以下のカスタムディメンションを持ったデータのみを対象に取得しています。

  • カスタムディメンション1: ランキング対象フラグ
  • カスタムディメンション2: ページタイトル
  • カスタムディメンション3: ページURL

事前にカスタムディメンションの作成とトラッキングコードの変更が必要です。

トラッキングコードの例

gtag.jsでは以下のようにコードを変更します。

const GA_TRACKING_ID = 'UA-123180440-1';
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', GA_TRACKING_ID, {
  'custom_map': {
    'dimension1': 'ranking_flag',
    'dimension2': 'page_title',
    'dimension3': 'page_url'
  },
  'ranking_flag': 'is_ranking',
  // ランキングのタイトルとしたい文字列を設定します
  'page_title': 'スタッフブログ',
  // ランキングのURL(リンク先)を設定します
  'page_url': '/blog/'
});

ランキングをページへ表示するJS

JSでランキングのJSONを取得してページへ表示します。以下のサンプルではjQueryMoment.jsを利用しています。

(function($) {
  $(function() {
    var startDate = moment().subtract(1, 'days').format('YYYY-MM-DD');
    var endDate = moment().subtract(8, 'days').format('YYYY-MM-DD');
    $.ajax({
      'type': 'GET',
      'url': 'example.php',
      'data': 'start=' + startDate + '&end=' + endDate
    }).done(function(json) {
      if (json.status === 'success' && json.data) {
        // 成功した場合
      } else if (json.status === 'error' && json.message) {
        // 失敗した場合
      }
    });
  });
}(jQuery));

まとめ

一般的なウェブサイトでは多く導入されているGoogle Analyticsのデータを利用することで、データベースへアクセスを記録してPHPで集計するような実装を行わなくてもサイト内のアクセスランキングを実装することが可能です。

今回はランキングの情報として表示する内容をカスタムディメンションに直接保存していますが、ページの公開後にタイトルが変更されると別ページ扱いとなります。

そういった問題への対策や、またタイトルやURL以外により多くの情報(例えばサムネイルやページの概要など)を取得したい場合はCMSと連携して動的に取得すると良いでしょう。次回はCMSと連携する方法をご紹介します。

お問い合わせ Contact

制作のご依頼、ご相談などは下記のフォームからご連絡ください。