karakaram-blog

[WordPress] Google Analytics APIを使いカテゴリ別ランキングを表示する

 ツイート 1  シェア 1  Google+1 0  Hatena 1

カスタムディメンジョン+Google Analytics API

このブログは、サイドバーに人気記事ランキングを表示しています。アクセス数の多い記事がひと目で分かるので、直帰率を下げるのに一役買っているのかなと思っています。

この人気記事ランキングを少し拡張して、現在開いているページと同じカテゴリの人気記事を表示するようにしてみました。

アクセス数の集計には Google Analytics のカスタム ディメンジョンと Google Analytics API を利用しています。WordPress Popular Posts プラグインを使えば同じことがもっと簡単にできそうですが、Google Analytics に情報があるのに自前で集計するのに抵抗があったので、このプラグインは使っていません。情報は一元管理が大事です。

動作確認環境

  • WordPress 3.9
  • ユニバーサル アナリティクス
  • Google Analyitcs API v3.0

目次

  1. カスタム ディメンジョンの設定を済ませておく
  2. Google Analytics API から解析情報を取得
  3. サイドバーにて、作成した html ファイルを読み込み
  4. cron 設定
  5. やってみたけどイマイチ 1記事1カテゴリしか集計できない

カスタム ディメンジョンの設定を済ませておく

[Google Analytics] カスタム ディメンジョンの設定方法 を参考に、WordPress のカテゴリをカスタム ディメンジョンに設定しておいてください。

Google Analytics API から解析情報を取得

で紹介している google-analytics-api.php を以下のように修正します。

このプログラムを実行すると、/var/www/wordpress/wp-content/themes/hoge/google-analytics-カテゴリ名.html が作成されます。

//google-analytics-api.php

//...
//中略
//上記記事を参照してください
//...

//集計期間は 1週間
$lastWeek = date_i18n('Y-m-d', strtotime('-7 day', current_time('timestamp')));
$yesterday = date_i18n('Y-m-d', strtotime('-1 day', current_time('timestamp')));

//1週間 の PV 数の多い順に取得
//カスタムディメンジョンも取得
$service = new Google_AnalyticsService($client);
$result = $service->data_ga->get(
    'ga:' . PROFILE_ID,
    $lastWeek->format('Y-m-d'),
    $yesterday->format('Y-m-d'),
    'ga:pageviews',
    array(
        'dimensions'  => 'ga:dimension1,ga:pagePath',
        'sort'        => 'ga:dimension1,-ga:pageviews',
    )
);

//取得した情報をカテゴリ別の配列に格納する
$ranking = [];
foreach ($result['rows'] as $value) {
    $category = $value[0];
    $url = $value[1];
    $pageView = $value[2];
    $ranking[$category][] = [$url, $pageView];
}

//カテゴリ別にランキング用 html を組み立ててファイルに出力
foreach ($ranking as $category => $pages) {
    $i = 0;
    $html = '';
    foreach ($pages as $page) {
        //API から 取得できる URL
        $url = $page[0];
        //URL から WordPress の postId を取得
        $postId = url_to_postid($url);
        if ($postId === 0) {
            continue;
        }
        //postId から 記事情報を取得
        $post = get_post($postId);
        //記事タイトルを取得
        $title = $post->post_title;
        //サムネイル画像
        $thumbnail = get_the_post_thumbnail($postId);
        //他に情報が欲しければ適当に。postId があればほとんどの記事情報が取れる
        //...

        //取得した情報を使用してランキング用 html をゴリゴリ組み立て
        //htmlのエスケープも必要に応じて
        //...
        $html .= $thumbnail . PHP_EOL;
        $html .= '<a href="' . $url .'" title="' . $title .'">' . $title . '</a>' . PHP_EOL;
        //...

        //htmlは 6件 で作成ストップ。次のカテゴリへ
        $i++;
        if ($i == 6) {
            break;
        }
    }
    file_put_contents('/var/www/wordpress/wp-content/themes/hoge/google-analytics-' . $category . '.html', $html);
}

ざっくり解説すると

  1. Google Analytisc API から記事 URL を 1週間 の PV 数の多い順に取得
  2. 取得した情報をもとに、カテゴリ別にランキング用 html をファイルに出力

ソート順を変更したり、その他の情報が欲しいときは以下サイトを参考に
Dimensions & Metrics Reference – Google Analytics — Google Developers

サイドバーにて、作成した html ファイルを読み込み

WordPress テーマの sidebar.php で作成した html ファイルを読み込みます。

...
<!--人気記事-->
<?php $categories = get_the_category(); ?>
<?php $category = $categories[0]; ?>
<?php $file = __DIR__ . '/google-analytics-' . $category . '.html'; ?>
<?php if (file_exists($file)) : ?>
<?php require $file; ?>
<?php endif; ?>
...

cron 設定

ランキング html 作成プログラムを cron に設定します。夜中の 1 時に起動する設定にしています。

# 夜中の 1 時に起動
0 1 * * * /usr/bin/php /var/www/cron/google-analytics-api.php

やってみたけどイマイチ 1記事1カテゴリしか集計できない

このやり方でカテゴリ別ランキングを作成することはできましたが、1記事1カテゴリしか集計できないのがイマイチ。1記事複数カテゴリの場合はどれか 1 カテゴリにまとまってしまう。

なので現在ほかの方法を模索中です。カスタムディメンジョンを使わず PV 情報を DB に突っ込めばいけそうなので、試してみたらまたご紹介しようと思います。

まとめ

  • Google Analytics API からカスタム ディメンジョンを含む情報の取得
  • 取得した情報をもとに、カテゴリ別ランキングを html に出力
  • サイドバーでランキング html を読み込み
  • cron 設定
  • 1記事1カテゴリしか集計できないのが課題

Google Analytics のカスタム ディメンジョンと Google Analytics API を使って、WordPress のサイドバーにカテゴリ別の人気記事ランキングを表示する方法を紹介しました。

やってみたらイマイチでしたが、カスタム ディメンジョンの勉強ができたのでこれはこれで良しとします。カスタム ディメンジョンと Google Analytics API を利用している例として参考にどうぞ。

 ツイート 1  シェア 1  Google+1 0  Hatena 1