31
31

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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

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

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

インストール

composerで。

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

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

使い方

PageView

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

javascriptの場合

<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の場合

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の場合

<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も可能です。

<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の場合

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も可能です。

ga(function(tracker) {
  var clientId = tracker.get('clientId');
});
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を書きたくないっていうちょっと個人的な意見もあったり。

以上。

31
31
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
31

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?