拙作 WordPress プラグインであるGianismは2.1から隠し機能としてGoogle Analyticsとの連携を行う機能を追加しました。想定している利用方法は次の通りです。
- Google AnalyticsのデータをCronなどで定期的に取得し、保存する。
これでなにができるかというと、次のようなことができます。
- 特定の投稿タイプの記事ランキングを週間、月間といった形で様々なスパンで作成する
- カテゴリー別のランキングなど、複雑な条件でのランキングを可能にする
- 「最近人気の検索ワード」や「コンバージョン率別に優れた投稿のリストを取得する」などの柔軟なデータ取得
免責事項
この機能はPHPおよびGoogle Analyticsに関する中級者以上の知識を要求します。管理画面で幾つかの項目を入力しただけで動く類いのものではありません。
もちろん、上手く使えば劇的な変化をもたらすでしょう。たとえば、あなたのサイトはGoogle Analyticsのデータを利用して、曜日や季節ごとに最適なコンテンツの並び替えを行ったりするようになるかもしれません。
ただし、あなたのサイトを作るのはあなたであり、そのことは忘れないでください。あなたの努力や、情熱、賢さといったものが結局はサイトを良くしていくのであり、プラグインではありません。
利用方法
さて、この機能の利用方法をお伝えします。
1. トークンを取得する
GianismがGoogleとの連携を済ませている場合、管理画面のツール直下に「Google アナリティクス」というメニューが表示されます。この画面でトークンを取得できます。ただボタンを押すだけです。
トークンはGianismがあなたが管理画面にいないときにこっそりGoogle アナリティクスのデータを取得するときに必要です。
2. ビューを選択する
トークンを取得すると、Google Analytics上のどのデータを利用するかが問われます。データにはアカウント、プロパティ、ビューという三段階があります。あなたがなにも考えないでアナリティクスを利用している場合、こんな風になっているのではないでしょうか。
- アカウント http://example.jp
- プロパティ http://example.jp
- ビュー すべてのWebサイトのデータ
もちろん、こうなっていたからといってあなたが悪いわけではありません。悪いのはGoogleアナリティクスのデフォルト設定です。この問題についてもう少し詳しく知りたい方は、Googleなどで検索してみてください。なにもわからないということがわかります。
とにかく、表示されるリストからあなたが「これだ!」と信じるものを選び、保存してください。その選択が間違っていた場合、データは保存されません。
3. データベースを作成する(オプション)
Googleアナリティクスからデータを取得したらそれを保存しなくてはなりません。では、どこに保存したらよいのでしょうか?
一つの物事をなすには色々な方法があります。煙草に火をつけるのにマッチを使うか、ライターを使うかというような意味においてです。したがって、保存する場所や方法には様々な選択肢があります。
しかし、選択肢が多過ぎるとなにをしたらいいかわからなくなってしまうだろうと思い、私はよくある形のテーブル構造を用意しておきました。ボタンを押すだけで作成されます。インデックスなども貼ってあるので、そんなに悪いものではないでしょう。
なお、このテーブルはプラグインを削除するときに一緒に削除されます(たぶん)。
4. Cronを作成する
さて、具体的にデータの取得と保存を行うファイルを作成します。このファイルは次のようなルールに遵守してください。
- テーマフォルダのルートに
app/gianism
というフォルダを作成し、そこにphpファイルを配置する - 1つのファイルに1つのクラスが記載されている
- クラス名およびファイル名はアッパーキャメルである(ex.
MyDailyRanking
ならMyDailyRanking.php
) Gianism\Cron\Daily
クラスを継承している
上記がCronの起動する条件です。この親クラスはWordPressのCronに必要な処理をほとんど自動で行うので、特に何かをする必要はありません。インストールが成功すれば、管理画面に表示されます。
上記に記載したテーブルを利用する場合、あなたが実装(または上書き)しなければならないのは次のプロパティおよびメソッドです。
- get_result
- 結果を取得し、配列を返すメソッドです。結果取得のためには
fetch
というメソッドが用意されており、そのパラメータ次第で取得できるデータを変更できます。 - parse_row
- 取得した結果の1つずつに対して実行されます。上記に記載したデータベースに保存する場合は
save
という便利なメソッドが用意されています。
実際の例として、このサイトで利用しているテーマをご覧下さい。また、APIドキュメントも参照してください。
なお、データの取得に重要なfetch
メソッドでは複雑な引数をとります。これらの引数はGoogle Analytics APIのCore Reporting APIが元になっています。Gianismが提供するのはあくまでGoogle APIs Client Library for PHPのラッパー機能のみです。
なお、データの取得がうまくできているか不安な場合はクラス定数SKIP_CRON
をtrueにすると、保存されなくなります。管理画面からどのようなデータが取得できているのか確かめることがでますので、まずは自動保存が働かないようにした上で、なんどもデータを取得し、テストしてみてください。設定を適切に行えば、ローカル環境でも商用環境と同じデータでテストを行うことができます。
あくまで参考ですが、当サイトではカスタム定義を利用して、シングルページのPVを計測しやすくしています。
<?php if( is_singular() ): ?> ga('set', 'dimension3', '<?= get_post_type() ?>'); <?php endif; ?> ga('send', 'page view');
上記は「シングルページの場合、カスタム定義3に投稿タイプを設定する」としています。このため、fetch
メソッドのフィルターに ga:dimension3==post
と設定することで、シングル投稿ページだけのPVを取得することができています。
他にも、投稿者のIDを設定するなどすれば、投稿者別のPVランキングなども作れるでしょう。もちろん、投稿IDが取得できてしまえば投稿者のIDを取ることもできるのですが、WordPressのデータベースとGoogleアナリティクスという二つのデータソースのどちらになにをやらせるかは開発者によって意見がわかれるでしょう。
私個人の意見では「Google Analyticsのデータは正であり、WordPressはそれを加工して取り込むだけ」とするのがシンプルでよいと思いますが、基本的には利用者の自由裁量です。
5. データの表示
さて、上記の設定が上手くいき、たとえば毎日上位100件の投稿IDとそのPVというデータセットが取得できたとします。では、どのようにしてそれを表示すればよいのでしょうか。
ここから先はWordPressの中級者以上の知識が求められます。
- リライトルール
- リライトルールとクエリバーを加工することによって、たとえば、 ranking/weekly/2014/08/01/ としたときに2014年8月第一週の上位100件のコンテンツを取得することができます。
- posts_requestフィルターの利用
- フィルターを利用し、ランキングの表示が求められていると判断される場合はSQLを書き換えます。
以上を実装すると、たとえば、このような感じになるでしょうか。
add_filter('posts_request', function($request, $wp_query){ if( $wp_query->get('ranking') ){ // クエリバーにrankingが設定されていたら // ランキングテーブルをJOINして、wp_postsテーブルを取得する。 // ページネーションなど考えるとけっこう大変です。 $query = 'Blah Blah Blah'; $request = $wpdb->prepare($query, $wp_query->get('ranking_cat')); } return $request; }, 10, 2);
こちらはまだ試していないので、実装したらこちらでご紹介します。
終わりに
以上、Gianismの隠れ新機能について紹介しました。元々は私が必要だと思ったから作った機能ですので、必要だと思う方はご利用ください。
なお、この機能をものすごくわかりやすく作る予定はなく、あくまでインハウスの制作者や受託で仕事を行う人など、プロフェッショナルな人を対象にしています。PHPの名前空間やWordPressのCronの仕様などについても説明はいたしません。
PV計測だけであればJetPackなどに機能は備わっていますので、そちらを利用することをお勧めいたします。