PHPでGoogleAnalyticsにトラッキング情報を送信する


昨今、話が上がっている「iOS9 + Crystal」のGoogleAnalytics（以下GA）の無効化問題みたいなのがあるので、調べてみたらPHPのサーバーサイドでGAへトラッキング情報を送る方法があったので試してみた。

今回お世話になったライブラリはこちら。

https://github.com/theiconic/php-ga-measurement-protocol

名前のままですがPHPでGAが扱えるライブラリです。2系と1系でPHPバージョンが違うのでご注意。（2系でご紹介します。）

## インストール

composerで。

```bash
php composer.phar install theiconic/php-ga-measurement-protocol
```

ちなみにLaravel4・5とYii 2とSymfony2に関してはそれぞれ便利なパッケージが用意されています。

- Laravel 4/5 - https://github.com/irazasyed/laravel-gamp
- Yii 2 - https://github.com/baibaratsky/yii2-ga-measurement-protocol
- Symfony2 - https://github.com/fourlabsldn/GampBundle

## 使い方

### PageView
 
たとえば、「http://sample.com/mypage」だった場合。

javascriptの場合

```js
<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-xxxxxxxx-xx', 'auto');
  ga('send', 'pageview');
</script>
```

phpの場合

```php
use TheIconic\Tracking\GoogleAnalytics\Analytics;

$analytics = new Analytics(true);

// ga('create', 'UA-xxxxxxxx-xx', 'auto');
$analytics->setProtocolVersion('1')
          ->setTrackingId('UA-xxxxxxxx-xx')
          ->setDocumentPath('/mypage')
          ->setClientId('12345678');

// ga('send', 'pageview');
$analytics->sendPageview();
```

これでPageViewTrackingと処理ができます。
閲覧しているページについてはこちらで指定する必要があります。(setDocumentPathの部分)
ClientIdについては後ほど。

### Event

Eventの処理も可能です。

javascriptの場合

```js
<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-xxxxxxxx-xx', 'auto');
  ga('event', 'category', 'action', 'label', 'value');
</script>
```

phpの場合

```
use TheIconic\Tracking\GoogleAnalytics\Analytics;

$analytics = new Analytics(true);

$analytics->setProtocolVersion('1')
          ->setTrackingId('UA-xxxxxxxx-xx')
          ->setDocumentPath('/mypage')
          ->setClientId('12345678');

// ga('event', 'category', 'action', 'label', 'value');
$analytics->setEventCategory('category')
          ->setEventAction('action')
          ->setEventLabel('label')
          ->setEventValue('value')
          ->sendEvent();
```

わかりやすくするために書いていますがjsもphpもPageView用にトラッキング処理を書いていればもう一度書く必要はありません。

### Ecommerce

ECサイト等で必要になるEcommerceも可能です。

```js
<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-xxxxxxxx-xx', 'auto');
  
  // @see https://developers.google.com/analytics/devguides/collection/analyticsjs/ecommerce
  ga('ecommerce:addTransaction', {
    'id': '1234',                     // Transaction ID. Required.
    'affiliation': 'Acme Clothing',   // Affiliation or store name.
    'revenue': '11.99',               // Grand Total.
    'shipping': '5',                  // Shipping.
    'tax': '1.29'                     // Tax.
  });
  
  ga('ecommerce:addItem', {
    'id': '1234',                     // Transaction ID. Required.
    'name': 'Fluffy Pink Bunnies',    // Product name. Required.
    'sku': 'DD23444',                 // SKU/code.
    'category': 'Party Toys',         // Category or variation.
    'price': '11.99',                 // Unit price.
    'quantity': '1'                   // Quantity.
  });
  
  ga('ecommerce:send');
</script>
```

phpの場合

```php
use TheIconic\Tracking\GoogleAnalytics\Analytics;

$analytics = new Analytics(true);

$analytics->setProtocolVersion('1')
          ->setTrackingId('UA-xxxxxxxx-xx')
          ->setDocumentPath('/mypage')
          ->setClientId('12345678');
          
// ecommerce:addTransaction
$analytics->setTransactionId(1234)
          ->setAffiliation('Acme Clothing')
          ->setRevenue('11.99')
          ->setShipping('5')
          ->setTax('1.29');
          
// ecommerce:addItem
$item = [
    'sku'      => 'DD23444',
    'name'     => 'Fluffy Pink Bunnies',
    'category' => 'Party Toys',
    'price'    => '11.99',
    'quantity' => '1',
];

$analytics->addProduct($_item);

// ecommerce:send
$analytics->setProductActionToPurchase();
```

phpの場合「ecommerce:addItem」時にidは必要ありません。「ecommerce:addTransaction」で設定した値を使用します。

特にEcommerceの場合、送信するデータをPHPで作成してviewに渡して処理することが多いと思いますがこれを使えばviewに渡すこと無くGAにEcommerce情報を送信することが可能です。

ほかにもGAで使用できるAPIのほとんどが使用可能だと思われます。

- General
- User
- Session
- Traffic Sources
- System Info
- Hit
- Content Information
- App Tracking
- Event Tracking
- E-Commerce
- Enhanced E-Commerce
- Social Interactions
- Timing
- Exceptions
- Custom Dimensions / Metrics
- Content Experiments
- Content Grouping

## ClientIdについて

CliantIdとはGAが「ga('create', 'UA-xxxxxxxx-xx', 'auto');」実行時にcookieにIDを所有していなければ自動的に発行されます。

参照 : https://developers.google.com/analytics/devguides/collection/analyticsjs/cross-domain#cookiesYum

書いてある通りですが、GETもSETも可能です。

```get
ga(function(tracker) {
  var clientId = tracker.get('clientId');
});
```

```set
ga('create', 'UA-XXXX-Y', 'auto', {
  'clientId': clientId        // Value is retrieved from method above.
})
```

getが可能なのでphp側で処理できようなところに設定すれば上記でのcliantIdに当て込むことが可能だと思います。ただ、「iOS9 + Crystal」などのGA無効化の場合にはPHP側でcliantIdを発行し、それを持ち回す必要があると思います。（GAの自動発行はtimestampをhash化したものの様です。）


## 使用してみて思ったこと

今回、使ってみてよかったことで「E-Commerce」は非常に便利だと思いました。通常であれば、購入情報をGAに合わせた配列等に変換してそれをviewに渡し、viewで回しながらせっせと処理しなければならないのですが、phpで簡潔させることによってviewに渡す必要が無くのなるのと同時に、queueに突っ込めば遅延処理をさせて、購入画面でのレスポンス速度も改善されると思われます。

あと、scriptタグ内にphpを書きたくないっていうちょっと個人的な意見もあったり。

以上。