Google Analyticsと連携してページビューの多い人気記事を表示する

WordPressの人気記事を取得する手段は数多くあれど、信頼性の高い数値はやはりGoogle Analytics。そこで、今回は公開されているAPIを利用して、Google Analyticsからページビューを取得する方法をご紹介します。

Google Analyticsと連携してPVを取得する

多少敷居が高いと感じるかもしれませんが、さほど難しい話ではありません。順を追って解説していきます。

Google Developers Consoleに新規プロジェクトを登録する

「Google APIs Client Library for PHP」を使用するためには、Google AnalyticsにアクセスするためのサービスアカウントをGoogle Developers Consoleに登録する必要があります。

Google Cloud Platform

Google Cloud Platform lets you build, deploy, and scale applications, websites, and services on the same infrastructure as Google.

Google Developers Consoleの言語を日本語にする

Google Developers Consoleのデフォルトの言語は英語になっています。そのままでも構いませんが、日本語が用意されていますので、言語設定から変更してしまいましょう。Google Developers Consoleにアクセスしたら、「Account Settings」をクリックします。

初めてGoogle Developers Consoleを使用する場合、利用規約への同意が必要となります。チェックしたら、「Continue」をクリックしてください。

引き続き、「Language & Formats」から、「LANGUAGE」を「日本語」に変更します。変更したら「Save」をクリックします。以上で、日本語化は完了です。

Google Analytics APIを使用するためのプロジェクト作成

次に、サイドメニューから「プロジェクト」を選択します。

「プロジェクトを作成」ボタンをクリックします。

プロジェクト名を入力します。プロジェクト名は任意で構いません。ここでは、弊サイトのブログ名としました。プロジェクトIDは自動的に割り振られるため意識する必要はありません。プロジェクト名を入力したら、「作成」をクリックします。

Google Analytics APIの有効化

続いて、作成したプロジェクトをクリックします。新規プロジェクトのデフォルトの状態では、「Google Analytics」を使用するためのAPIは無効になっているため有効化する必要があります。サイドメニューの「APIと認証」から、「API」をクリックします。

「Analytics API」の「無効」ボタンをクリックすると有効になります。

Analytics API利用上の注意点

Analytics APIの利用は、50,000 requests/dayと上限が定められています。通常の使用方法であれば、まず上限に達する可能性はないと思いますが、頭の片隅にでも気に留めておいてください。

続いて、Google Analyticsにアクセスするための認証情報を作成します。サイドメニューの「APIと認証」から「認証情報」をクリックします。

「OAuth」の「新しいクライアントIDを作成」をクリックします。

今回は、バッチプログラムによる定期実行を想定しているため、「サービスアカウント」を選択します。

iPhoneやAndroidなどのアプリケーションからアクセスしたい場合は「インストールされているアプリケーション」、ブラウザからGoogle Analytics APIを使用して情報を取得したい場合は「ウェブアプリケーション」を選択します。

「サービスアカウント」を選択したら、「クライアントIDを作成」をクリックします。

「サービスアカウント」を選択した場合、Google Analytics APIを使用する場合の認証方式は公開鍵認証方式になります。そのため、クライアントIDを作成後、秘密鍵(拡張子が .p12 のファイル)が自動的にダウンロードされます。後で使用します。

公開鍵認証方式とは

デジタル署名(正当性の電子証明)にも応用される方式で、秘密鍵、公開鍵のペアで認証を行います。秘密鍵の所有者のみが、公開鍵の所有者の情報を取得できます。

共通鍵暗号と公開鍵暗号の解説とSSHでの認証手順 – VPSサービスの使い方

SSHで公開鍵認証を利用する場合に利用する公開鍵暗号について公開鍵暗号の仕組みと共通鍵暗号とどう違うのかについて解説します。

以上で、認証情報の作成は完了です。クライアントID、メールアドレスは後で使用しますので控えておきましょう。

Google Analyticsにサービスアカウントを登録する

続いて、Google Developers Consoleで作成したサービスアカウントが、Google Analyticsの情報を取得できるように権限の割当を行います。

Google アナリティクス – モバイル、プレミアム、無料のウェブサイト解析 – Google

マーケティングやビジネスの意思決定を効果的に行うために、Google アナリティクスで必要なデータを取得しましょう。ウェブサイト、アプリ、エンタープライズ ビジネスで利用できます。

Google Analyticsにアクセスしたら、画面上部のメニューから「アナリティクス設定」をクリックします。

Google Developers Consoleで作成したアカウントを登録するために、「ユーザー管理」をクリックします。

「権限を付与するユーザー」にGoogle Developers Consoleで作成したサービスアカウントのメールアドレスを入力します。権限はデフォルトの「表示と分析」で構いません。

続いて、Google Analytics APIからアクセスするためのビューの情報を取得します。「ビュー」から「ビュー設定」をクリックします。

ここに表示される「ビューID」を使用しますので控えておいてください。

Google APIs Client Library for PHPのダウンロード

Googleの提供する各種サービスにアクセスするためのライブラリがGitHubで公開されています。以下のリンクからライブラリ(「Download ZIP」をクリック)をダウンロードしておきましょう。

google/google-api-php-client

google-api-php-client – A PHP client library for accessing Google APIs

ダウンロードしたZIPファイルを解凍します。examplesフォルダには、Google APIを利用するための簡単なサンプルが用意されています。Google APIを利用する前に一度目を通しておくことをオススメします。実際に使用するライブラリは、Googleフォルダ配下にあります。

google-api-php-client-master
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── composer.json
├── examples
└── src
    └── Google
        ├── Auth
        ├── Cache
        ├── Client.php
        ├── Collection.php
        ├── Config.php
        ├── Exception.php
        ├── Http
        ├── IO
        ├── Model.php
        ├── Service
        ├── Service.php
        ├── Signer
        ├── Utils
        ├── Utils.php
        └── Verifier

Google Analyticsからページビューを取得する

準備は整いました。いよいよ、Google Analyticsへのアクセスを行います。今回は、弊サイトを運営しているレンタルサーバー 高速・高機能・高安定性の【エックスサーバー】を例に説明します。

Google Analyticsプログラムのディレクトリ構成

弊サイトのGoogle Analyticsプログラムのディレクトリ構成は以下の通りとなっています。

.
├── script
│   ├── xxxxx-privatekey.p12
│   ├── Google
│   │   ├── Auth
│   │   ├── Cache
│   │   ├── Client.php
│   │   ├── Collection.php
│   │   ├── Config.php
│   │   ├── Exception.php
│   │   ├── Http
│   │   ├── IO
│   │   ├── Model.php
│   │   ├── Service
│   │   ├── Service.php
│   │   ├── Signer
│   │   ├── Utils
│   │   ├── Utils.php
│   │   └── Verifier
│   └── analytics.php
└── public_html
    └── wp-blog-header.php

xxxxx-privatekey.p12は事前にダウンロードした秘密鍵です。WordPressが動作しているpublic_htmlの外側に格納しています。Googleは事前にダウンロードしたGoogle API Libraryです。こちらも、通常使用することはありませんので、秘密鍵と同一階層に置いています。 analytics.phpがプログラム本体です。

analytics.phpのソースコード

analytics.php

// WordPressの関数を外部から利用する
define('WP_USE_THEMES', false);
require('../public_html/wp-blog-header.php');

// Google APIs Client Library for PHPに対してパスを通す
set_include_path(__DIR__);

// Google APIs Clientの読み込み
require_once 'Google/Client.php';
require_once 'Google/Service/Analytics.php';

// Google Developers ConsoleのクライアントID
define('CLIENT_ID', 'XXXXX.apps.googleusercontent.com');

// Google Developers Consoleのメールアドレス
define('SERVICE_ACCOUNT_NAME', 'XXXXX@developer.gserviceaccount.com');

// Google Developers Consoleで生成された秘密鍵へのパス
define('KEY_FILE', 'XXXXX-privatekey.p12');

// Google アナリティクスのビューID
define('PROFILE_ID', 'XXXXX');

$client = new Google_Client();
$client->setApplicationName('Google Analytics for Macious');
$client->setClientId(CLIENT_ID);
$client->setAssertionCredentials(new Google_Auth_AssertionCredentials(
  SERVICE_ACCOUNT_NAME,
  array('https://www.googleapis.com/auth/analytics'),
  file_get_contents(KEY_FILE, true)
));

$service = new Google_Service_Analytics($client);
$results = $service->data_ga->get(
  'ga:' . PROFILE_ID,
  '2005-01-01',  // 開始日
  '2100-01-01',  // 終了日
  'ga:pageviews',
  array(
    'dimensions'  =>  'ga:pagePath', // 投稿記事のスラッグを取得
    'sort'      =>  '-ga:pageviews'  // ページビュー数で並べ替え
    // 'max-results'  =>  '-1'  //件数
  )
);

foreach ($results['rows'] as $result) {
  $post_url = home_url() . $result[0];

  // パーマリンクから投稿記事のIDを取得
  $post_id = url_to_postid($post_url);

  // 投稿記事、固定ページのみを取得
  // 投稿後に記事のタイトルを変更した場合、
  // 同一の$post_idが複数取得される可能性があるため排除
  if ($post_id <=0 || in_array($post_id, $check)) {
    continue;
  }

  // 投稿記事のIDから投稿情報を取得
  $post = get_post($post_id);

  // 投稿記事の状態が「publish」(公開済み)かつ、固定ページを除く
  if ('publish' === get_post_status($post) && 'post' === get_post_type($post)) {

    // wp_postmetaテーブルに投稿記事のID毎のPV数をアップデート
    update_post_meta($post->ID, '_custom_pageviews', $result[1]);
  }
  $check[] = $post_id;
}

順を追って説明します。以下、WordPressのデータベース名称のプレフィックスはwp_であることを前提とします。

// WordPressの関数を外部から利用する
define('WP_USE_THEMES', false);
require('../public_html/wp-blog-header.php');

プログラム後半でWordPressの関数を使用します。WordPress外で、同関数群を使用するためには、ヘッダでこのように宣言します。

Integrating WordPress with Your Website ” WordPress Codex

By nature, WordPress is very powerful. It can be as complex or as simple as you wish. With that in mind, how much you want to use WordPress with your existing website is totally up to you.

wp-blog-header.phpを読み込めばOKです。

// Google APIs Client Library for PHPに対してパスを通す
set_include_path(__DIR__);

続いて、analytics.phpの実行ディレクトリにパスを通します。Google API Libraryは、 Google ディレクトリの格納されている場所まで、事前にパスを通しておく必要があります。

define('CLIENT_ID', 'XXXXX.apps.googleusercontent.com');
define('SERVICE_ACCOUNT_NAME', 'XXXXX@developer.gserviceaccount.com');
define('KEY_FILE', 'XXXXX-privatekey.p12');
define('PROFILE_ID', 'XXXXX');

Google Developers Consoleで作成したプロジェクト情報を定義します。PROFILE_IDは、Google AnalyticsのビューIDを示しています。

$client = new Google_Client();
$client->setApplicationName('Google Analytics for Macious');
$client->setClientId(CLIENT_ID);
$client->setAssertionCredentials(new Google_Auth_AssertionCredentials(
  SERVICE_ACCOUNT_NAME,
  array('https://www.googleapis.com/auth/analytics'),
  file_get_contents(KEY_FILE, true)
));

Google Analyticsに対する認証を行います。認証情報に、事前に入手した秘密鍵の情報を指定しています。公開鍵認証により通常のID/PWによるアクセスが不要になります。

$service = new Google_Service_Analytics($client);
$results = $service->data_ga->get(
  'ga:' . PROFILE_ID,
  '2005-01-01',  // 開始日
  '2100-01-01',  // 終了日
  'ga:pageviews',
  array(
    'dimensions'  =>  'ga:pagePath', // 投稿記事のスラッグを取得
    'sort'      =>  '-ga:pageviews'  // ページビュー数で並べ替え
    // 'max-results'  =>  '-1'  //件数
  )
);

いよいよ、Google Analyticsから情報を取得します。弊サイトでは1日に1回(午前3時)にGoogle Analyticsから情報を収集し全投稿記事に対するページビューの集計を行っています。

例えば、月間アクセス数ランキング等を作成したい場合は、開始日、終了日を、各々先月の初日と末日にし、取得件数を絞り込んだほうが良いでしょう。ちなみに、先月の初日、末日は、以下の方法で簡単に取得できます。

$dt_from = new Datetime('first day of now -1 months');
$dt_to = new Datetime('last day of now -1 months');

ディメンションで、投稿記事のスラッグのみを取得していますが、タイトルを取得したい場合は、カンマ区切りでga:pageTitleを指定します。

Google Analyticsから取得した情報は、$result['rows']に格納されます。

foreach ($results['rows'] as $result) {
  $post_url = home_url() . $result[0];
  $post_id = url_to_postid($post_url);
  if ($post_id <=0 || in_array($post_id, $check)) {
    continue;
  }
  $post = get_post($post_id);
  if ('publish' === get_post_status($post) && 'post' === get_post_type($post)) {
    update_post_meta($post->ID, '_custom_pageviews', $result[1]);
  }
  $check[] = $post_id;
}

Google Analyticsから取得したページビューをWordPressのデータベースに格納します。Google Analyticsから取得できるURLはスラッグ部分のみとなるため、まず、home_url関数を使用してパーマリンクを作成します。続いて、 url_to_postid関数を使用して、その投稿記事のIDを取得します。

続いて、投稿記事のIDをもとに投稿記事情報をget_post関数で取得します。後は、その記事の状態が「Publish」(公開済み)、かつ「post」(投稿記事)の場合のみ、 update_post_meta関数を使用して、wp_postmetaテーブルを更新します。ここで定義している_custom_pageviewsは任意の名称を使用してください。後からページビューを取得するために必要になります。

wp_postmetaテーブルはwp_postsに紐付くオプション情報を保存しておくためのテーブルです。任意のキーと値の組み合わせで、保存することができます。例えば、_custom_keywordsという項目を設けておき、記事作成時にこのキーの値を更新し、ブログ表示時に<meta>タグの情報として表示するという活用方法もあります。

なお、wp_postmetaテーブルから値を取得するためには、get_post_meta関数を使用します。

get_post_meta() | Function | WordPress Developer Resources

Please note that if a db collation is case insensitive (has with suffix _ci) then update_post_meta and delete_post_meta and will update/delete/query the meta records with keys that are upper or lower case. However get_post_meta will apparently be case sensitive due to WordPress caching. See https://core.trac.wordpress.org/ticket/18210 for more info.

Google Analyticsからの情報取得時の注意点

Google Analyticsから取得した情報には、単一の投稿記事のみならず、カテゴリーや固定ページ等を含む情報も含まれます。また、記事公開後にタイトル等を変更した場合、変更前後の記事のページビュー数を別々に取得してしまうため、同一IDの場合は処理をスキップする、などの考慮が必要です。

Google Analyticsプログラムをエックスサーバーのcronに登録する

最後にanalytics.phpをエックスサーバーのcronに登録します。cronに登録する前に必ずローカル環境で動作を確認しましょう。

cron登録時の注意点として、コマンドは実行環境も含めてフルパスで指定する必要があります。単独でプログラムを登録しても正常に動作しません。これはハマりがちですので注意してください。

PHP 5.3を使用している場合

/usr/bin/php5.3 /home/xxxx/analytics.php

Google Analyticsから取得した記事をページビュー順に表示する

Google Analyticsから取得した記事をページビュー順に表示するためには、WP_Query関数を使用します。ポイントは、パラメータのorderbymeta_value_nummeta_keyanalytics.phpで更新したキーを指定します(ここでは、_custom_pageviewsを指定しています。

$r = new WP_Query(array(
  'post_type' => 'post',
  'posts_per_page' => 6,
  'post_status' => 'publish',
  'ignore_sticky_posts' => true,
  'orderby' => 'meta_value_num',
  'meta_key' => '_custom_pageviews',
  'order' => 'DESC',
));

パラメータ

パラメータ 内容
post_type 投稿の種類を指定する。”post”(記事)、”page”(固定ページ)など。
posts_per_page 取得する記事の件数。
post_status 記事の状態。”publish”(公開)、”draft”(下書き)など。
ignore_sticky_posts ページの先頭に固定している記事を含めるかどうか。”true”(含めない)、”false”(含める)
orderby 取得する記事のソートに指定する項目。
meta_key wp_postmetaテーブルに保存したキーの値。
order 取得する記事の順序を指定。”DESC”(降順)、”ASC”(昇順)。

WP_Query関数で記事を取得した後は、WordPressの通常のループで記事を取得して、ページビュー順にソートされた記事を表示することができます。

if ($r->have_posts()):
$r->have_posts()): $r->the_post();
...
endwhile;
wp_reset_postdata();
endif;

まとめ

Google Analyticsから常時ページビューを取得する、というのはリクエスト数の上限を考慮しなかったとしても、現実的ではありません。実行には多少時間を要するため、常時取得した場合、サイトの表示速度に影響があります。

cronによる定期実行が現実的ですが、cronが利用できない場合は wp_schedule_event関数を使用する方法も考えられます。WordPressアクセス時に開始時刻を過ぎていた場合にイベントが実行される、という疑似的なスケジューラですが、サイトの表示速度への影響は最小限(初回アクセス時のみ)に抑えられます。

Function Reference/wp schedule event ” WordPress Codex

Schedules a hook which will be executed by the WordPress actions core on a specific interval, specified by you. The action will trigger when someone visits your WordPress site, if the scheduled time has passed. See the Plugin API for a list of hooks.

少し長文になりましたが、最後までお付き合いいただきましてありがとうございました。

参考リンク

以下のサイトを参考にさせていただきました。

Google Analytics API v3をPHPから利用する方法

このブログも記事数やアクセス数が増えてきたので、他の情報サイトでよく見かける「人気ランキング」を作成してみました。サイドバーにある「カテゴリ別人気記事」がそれにあたります。WordPress Popular Posts のようなランキング作成プラグインを利用してもよかったのですが、せっかく Google Analytics でアクセス解析をしているので、Google Analytics API v3 から情報を取得してアクセスランキングを作成してみることにしました。API から情報を取得するにあたり、結構いろんなところでつまずいたので備忘録。 この記事では、Google Analytics API v3 を PHP のバッチで定期的に叩いて解析情報を取得し、月間 PV ランキング TOP10 を取得する方法を紹介します。 Google Developers Console を日本語化 Google Developers Console で新規プロジェクトを作成 Google Analytics API を有効化 OAuth 2.0 の クライアント ID を作成する クライアント ID 作成時に発行されたメールアドレスを Google Analytics ユーザーに登録する Google Analytics のビュー

WordPressの関数をちょっと試したいときにWordPress外のPHPから使うための小技

WordPressでなんやらかんやら試したいときにテーマファイルに直接書きこんでむちゃくちゃになることってないですか。ないですよね。ですよねー。 関数とか出力とかをちょっと試したいなーと思うことが多くなってきて、調べてみました。 やりたいことは、 「WordPress外からWordPressの関数を使って出力すること」 です。 探してみました。あるもんですねぇ。 さっと読んでから試してみました。注意点はこちら です。ローカルホストならローカルホスト内でどこでもいけますね。 ※ちなみにぼくの環境では localhost/www/wp にWordPressをインストールしています。 環境に合わせてパスは適宜置き換えてください。 1, まずはphpファイルを作成 localhost/www/test.php ってのを作ってみます。 2, WordPressのヘッダーを require でインクルードする Codex には2つ書いてあります、どっちでもいいよ!っとのことなのでスイートなほうを。 これで準備おっけー。なんとお手軽…! 3, WordPress 関数を使ってみる ちょー簡単に、WordPressのバージョンを出力してみます。 すると、おお!出ました。 これだけです。 投稿の出力も普通にできました。 これは頗る便利ですね、最近真面目にWordPressを始めたので知らないことばかりで毎日楽しいです。 test用のphpを作ってよく使うコードを書いておけばしゅっとチェックしたりできますね。 サーバーに管理用のコードを置いておけばめんどうなことをせず色々できそう!

この記事が気に入ったら
いいね ! しよう

Twitter で