Google『ユニバーサル アナリティクス』への対応法(暫定版)
[2015.9.26追記]
2015年9月25日リリースのバージョン3.0.8に合わせたコードを後半に追記しました。
3.0.7はユニバーサル アナリティクス非対応
ウェブサイトの運用と改善に欠かせないツールの一つ、Google Analytics。「コーポレートサイトにちょうどいいCMS」をうたうだけあって、baserCMSには導入のハードルをできるだけ下げる仕組みが用意されています。
それが、baserCMS管理画面の[システム管理]にある「Google Analytics ウェブプロパティID」欄と、googleAnalytics() という関数。
あらかじめ /app/webroot/theme/{使用中のテーマディレクトリ}/Layouts/default.php などの <head> セクション内に
<?php $this->BcBaser->googleAnalytics() ?>
と書いておき、「Google Analytics ウェブプロパティID」欄にGoogle AnalyticsのウェブプロパティIDを記述することで、トラッキングコードが自動的に出力されます。
ところがこのコード、本記事執筆時点のbaserCMS 3.0.7では2014年4月に正式公開された『ユニバーサル アナリティクス(UA)』に対応したものになっていません。Googleの『Universal Analytics Upgrade Center』では、UA以外の非推奨トラッキングライブラリについて「UA正式公開後最長2年までデータ受信する(=サポートする)」旨のことが書かれているので、<head> 内に出力するコードは早々にUAに切り替えた方がよさそうです。
Note: At this time, none of the non-Universal Analytics tracking libraries have been officially deprecated. When deprecation occurs, it will be announced on this page as well as in the changelogs of the individual libraries. Data received from deprecated libraries will continue to be processed for a minimum of two years following an official deprecation announcement.
(『Universal Analytics Upgrade Center』より)
トラッキングIDは新規取得が無難……という話
旧来のトラッキングコードで使用中のウェブプロパティIDはそのままUAにも転用可能です。しかし、2015年8月に開かれたWordPressカンファレンス『WordFes Nagoya 2015』に登壇された運営堂の森野誠之さんによると「UAは従来のAnalyticsと計測方法が大きく異なり、新機能も追加されているため、新たにトラッキングIDを取得した方が無難」とのこと(下のスライド27~30枚目)。
ということで互換性の観点から、現時点では新旧のトラッキングID(ウェブプロパティID)・トラッキングコードを設定して併用するのがベターな選択といえそうです。
対応策? 管理画面で新旧のIDを登録する
まず、管理画面の[システム管理]-「Google Analytics ウェブプロパティID」欄に、旧ID・新IDをカンマ区切りで記述します(例:UA-xxxxxxx,UA-yyyyyyy ※UA-xxxxxxx=旧ID・UA-yyyyyyy=新ID)。
次に、googleAnalytics() が読み込むエレメント /lib/Baser/View/Elements/google_analytics.php を /app/webroot/theme/{使用中のテーマディレクトリ}/Elements 内にコピー(これにより、テーマ内の google_analytics.php が優先して読み込まれます)。コピーした google_analytics.php を下のようにカスタマイズします。
<?php if (!empty($siteConfig['google_analytics_id'])): ?> <?php $id = explode(',', $siteConfig['google_analytics_id']) ?> <?php if (!empty($id[0])): // 従来のコードを挿入 ?> <script type="text/javascript"> var _gaq = _gaq || []; _gaq.push(['_setAccount', '<?php echo $id[0] ?>']); _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })(); </script> <?php endif; ?> <?php if (!empty($id[1])): // ユニバーサルアナリティクスのコードを挿入 ?> <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', '<?php echo $id[1] ?>', 'auto'); ga('send', 'pageview'); </script> <?php endif; ?> <?php endif; ?>
全体的な挙動として
- 「Google Analytics ウェブプロパティID」欄にID登録がなければトラッキングコードを出力しない
- IDが1つだけ登録されていれば旧IDと判断し、従来のコードのみを出力する
- IDがカンマ区切りで2つ登録されていれば、1つめのIDで従来のコードを、2つめのIDでUAのコードを出力する
という処理を行うようにしています。
対応策? 新旧のIDを googleAnalytics() の引数として渡す
関数 googleAnalytics() は /lib/Baser/View/Helper/BcBaserHelper.php にあり、内部的には関数 element('google_analytics') を実行しています。element() はエレメントに引き継ぐ値を第2引数で渡せるので、ここに旧ID・新IDを連想配列として渡す方法も一案としてありでしょう(管理画面の設定値は無視されますが)。
まず、呼び出し側のテンプレートファイル(たいていの場合 /app/webroot/theme/{使用中のテーマディレクトリ}/Layouts/default.php)の <head> セクションで下のように記述します(UA-xxxxxxx=旧ID・UA-yyyyyyy=新ID)。
<?php $this->BcBaser->googleAnalytics(array('ga' => 'UA-xxxxxxx', 'analytics' => 'UA-yyyyyyy')) ?>
次に「対応策?」のコードのうち1~3行・29行~30行を削除したうえで、コード内の変数名を置換します。
- $id[0] を $ga に
- $id[1] を $analytics に
バージョン3.0.8で新旧のコードが切り替え可能に
baserCMSのユニバーサル アナリティクス対応については、開発プロジェクトでもチケットが切られており、2015年9月25日リリースの3.0.8で
- 旧版からのアップデート時は、従来のトラッキングコードを出力
(デフォルトでは /lib/Baser/View/Elements/google_analytics_old.php を読み込む) - 新規インストールの場合はUAのコードを出力
(デフォルトでは /lib/Baser/View/Elements/google_analytics.php を読み込む)
という機能が実装されています(GitHubの変更履歴)。
旧版からのアップデートでも[システム管理]の「ユニバーサルアナリティクスを利用している」をチェックすることでUAのコードを出力できるようになりますが、前述の互換性の課題もあるので、サイト運用ポリシーに合わせて「一気にUAに切り替える」「2つのコードを併用する」のいずれかを選択されるとよいでしょう。
3.0.8で「対応策?」を使う場合、
旧ID・新IDをカンマ区切りで設定google_analytics.php をカスタマイズ「ユニバーサルアナリティクスを利用している」にチェックを入れる
という段階を踏む必要がありそうです(正式リリース前なので想像ですけど)。
ということで、3.0.8がリリースされたのでコードを少し整理してみました。
前述の対応策でもよいのですが、google_analytics_old.php と google_analytics.php というエレメントファイルができたので、これを活用することにしましょう。関数 googleAnalytics() でなく element() を使った方が、/lib/Baser/View/Elements からコピーしてカスタマイズする手間も省けすっきり書けます。
対応策?(3.0.8対応版)
if (!empty($siteConfig['google_analytics_id'])) { $ids = explode(',', $siteConfig['google_analytics_id']); $suffixes = array('_old', ''); foreach ($ids as $key => $id) { $this->BcBaser->element('google_analytics' . $suffixes[$key], array('siteConfig' => array('google_analytics_id' => $id))); } }
対応策?(3.0.8対応版)
$ids = array('UA-xxxxxxx', 'UA-yyyyyyy'); // UA-xxxxxxxは旧ID・UA-yyyyyyyは新ID $suffixes = array('_old', ''); foreach ($ids as $key => $id) { $this->BcBaser->element('google_analytics' . $suffixes[$key], array('siteConfig' => array('google_analytics_id' => $id))); }