炭火Blog

[2023]Google Analytics APIを利用した人気記事ランキングを表示する[WordPress]

Blogging
codewordpress

※このページにはプロモーションが含まれています。

Table of Contents

PHPはWordPressのテーマを少し触るくらいの知識しかありません。そこで、もう少し難しいことに挑むシリーズ。第1弾はGoogle AnalyticsのAPIを使ってアクセスランキングを作ります。

ランキング表示の目標

試しに30日間のデータを取得したところ、毎日変化するランキングはほとんど変化することなく、いつ見ても同じ様に見えるので、もう少し短めの1週間分を集計します。

ページのデザインを考慮し、上位6ページ分のデータを取得します。

1日1回サーバーのcronを使ってAPIによってデータを取得し、データをキャッシュしてページの表示に利用します。

Amazonセールとイベント

ローカル環境で動くものを作る

Google Analytics Data API (GA4)

Google社のサイトを頼りに作業を進めます。

最初に見つけた日本語に翻訳されているページは情報が古く、ビューIDを使うものでした。ビューIDは現在存在しないので、上記のぺーじの情報を元に作業を進める必要がありました。

APIを使えるようにする

最初に、Analytics APIを使えるようにします。上記のリンクからたどることもできますが、UAの説明が混ざっていたり分かりにくいので、https://console.cloud.google.com/からの作業のほうが良いかもしれません。

  1. プロダクトIDの作成
  2. サービスアカウントの作成
  3. credentials.jsonの取得
  4. メールアドレスを作成しAnalyticsとの紐付け

この段階では、APIを使えるようにする事と、credentials.jsonを保存します。

クライアントライブラリをダウンロードする

調べた中ではcomposerを使わずにダウンロードしても使えるとの記載があったので試したところ、ローカルの環境とサーバー環境のどちらもエラーが出て動かなかったので、composerを使ってダウンロードします。

今回はpopular_postsフォルダを作ってそこにクライアントライブラリをインストールします。

$ composer require google/analytics-data

を実行するとエラーがたくさん出ます。標準ではcomposerがインストールされていないようです。

同じくbcmathという機能拡張も必要なことから、同じくインストールします。

LinuxだとPCに簡単にインストールできますが、それ以外の場合はお使いの環境に合わせて下さい。

コードを変更してデータをキャッシュさせる

例として挙げられているPHPのコードを元にキャッシュできるように変更します。

キャッシュする方法はjsonファイルに書き出す方法とデータベースに書き込む方法を考えて作成したのですが、データベースの方はセキュリティを考えてボツとしました。

データーベースをWordPress以外のファイルから触る場合のセキュリティに自信がなく、それに比べてファイルの場合はより安全だと考えました。

popular_posts/ga_analytics_api.php

<?php

require 'vendor/autoload.php';

use Google\Analytics\Data\V1beta\Client\BetaAnalyticsDataClient;
use Google\Analytics\Data\V1beta\DateRange;
use Google\Analytics\Data\V1beta\Dimension;
use Google\Analytics\Data\V1beta\Metric;
use Google\Analytics\Data\V1beta\RunReportRequest;

// プロパティIDを設定
$property_id = '**********';

// このスクリプトの絶対パスを取得
$scriptPath = __DIR__;

// 認証情報のJSONファイルの絶対パスを指定
$credentialsPath = $scriptPath . '/credentials.json';

// 認証情報を設定
putenv('GOOGLE_APPLICATION_CREDENTIALS=' . $credentialsPath);

// Analytics Data APIクライアントのインスタンスを作成
$client = new BetaAnalyticsDataClient();

// API呼び出しを行うためのリクエストを作成
$request = (new RunReportRequest())
    ->setProperty('properties/' . $property_id)
    ->setDateRanges([
        new DateRange([
            'start_date' => '7daysAgo',
            'end_date' => 'yesterday',
        ]),
    ])
    ->setDimensions([new Dimension([
        'name' => 'pagePath',
    ])])
    ->setMetrics([new Metric([
        'name' => 'screenPageViews',
    ])])
    ->setLimit(6); // 結果の数を6に制限

// レポートを実行
$response = $client->runReport($request);

$data = [];
foreach ($response->getRows() as $row) {
    $url = $row->getDimensionValues()[0]->getValue();
    $pageViews = $row->getMetricValues()[0]->getValue();

    $data[] = [
        'url' => $url,
        'page_views' => $pageViews,
    ];
}

// 結果をJSONファイルに保存
$json_data = json_encode($data, JSON_PRETTY_PRINT);
file_put_contents(__DIR__.'/ranking_data.json', $json_data);

お使いのGoogle AnalyticsのプロパティIDとcredentials.jsonを設定すると、このga_analytics_api.phpをcronで実行することでranking_data.jsonが保存されます。

ランキングを表示させる

<?php
$ranking_data = home_url('/popular_posts/ranking_data.json');
$opts = [
    'http' => [
        'method' => 'GET',
        'header' => 'Authorization: Basic ' . base64_encode('idididididid:passpasspass')
    ]
];
$json_data = file_get_contents(ranking_data , false, stream_context_create($opts));
$data = json_decode($json_data, true);

if ($data === null) {
    return;
} else {

    $rank = 1;
    foreach ($data as $item) {
        $url = $item['url'];
        $accessCount = $item['page_views'];
        $post_id = url_to_postid($url);
        $thumbnail = get_the_post_thumbnail($post_id, 'thumbnail');
        $title = get_the_title($post_id);
        ?>
        <a href='<?php echo $url; ?>'>
            <div><?php echo $title; ?></div>
            <p><?php echo $accessCount; ?> views</p>
            <div><?php echo $thumbnail; ?></div>
            <p><?php echo $rank; ?></p>
        </a>
        <?php
        $rank++;
    }
}
?>

セキュリティを考えてドメイン外のディレクトリにインストールすると、クライアントライブラリが動きませんでした。なにか理由があるのか調べても分からず、試行を繰り返したのですが、結局よく分からずでした。

セキュリティ対策

こうなると外部からのアクセスが可能になってしまうので対策が必要になります。

$opts = [
    'http' => [
        'method' => 'GET',
        'header' => 'Authorization: Basic ' . base64_encode('idididididid:passpasspass')
    ]
];

popular_postsのベーシック認証のIDをididididididに、passpasspassはパスワードを記入します。

私の環境ではベーシック認証でcronが作動しなかったので、サーバーのIPを指定してcronが動くようにします。

Satisfy Any
order deny,allow
deny from all
allow from xxx.xxx.xxx.xxx

popular_postsフォルダにある.htaccessに追記することでcronが動くようになりました。

検索botに覗かないでもらう

Disallow: /popular_posts/

WordPressの場合は実態のファイルがないのですが、robots.txtにpopular_postsディレクトリを無視するよう記述を加えました。

これでローカル環境での行う事前の用意が終了します。次に実際のレンタルサーバーでコードが動くようにします。

レンタルサーバーで動かす

上にも書いたのですがcomposerを使わずにクライアントライブラリをアップロードしても、正常には動作しませんでした。composerを使うためにはレンタルサーバーとssh通信でつなぐ必要があります。

Windowsだとアプリケーションで繋げられるようですがLinuxではコマンドラインを使いました。初めてのことで手間取り、なかなか繋がりません。

レンタルサーバーとのssh通信

私の使っているレンタルサーバーではsshを使うために公開認証用鍵ペアの生成をし、鍵をダウンロードします。おそらく殆どのレンタルサーバーでも同じだと思います。

鍵をダウンロードして

ssh -p aa -i bbbbb.key -l cccccc dddd.ne.jp
aaポート
bbbbb.keyダウンロードした公開認証用鍵
ccccccサーバーID
dddd.ne.jpサーバーアドレス

上のように入力してもパーミッション関連のエラーがでて繋がりません。

調べると公開鍵を新たに作った.sshフォルダの中に入れ、.sshフォルダのパーミッションを700、bbbbb.keyのパーミッションを600に設定すれば繋がりました。

ssh -p aa -i .ssh/bbbbb.key -l cccccc dddd.ne.jp

composerを動かすための準備

やっとのことでcomposerを動かせる段階まで来たら、またもや山盛りのエラーです。

  1. Composerを使おうとするとエラーが出る
  2. Composerのバージョンが低いのが原因
  3. Composerのバージョンアップができない
  4. PHPのバージョンが低いことが原因
  5. シンボリックリンクを使ってSSH用のPHPのバージョンを上げる
  6. Composerをアップデート
  7. Analyticsクライアントライブラリのインストール

上のリストを調べながら進めてやっとクライアントライブラリがインストールされました。ここまで行けば後はローカル環境で作成したファイルをアップロードします。

ローカルの環境で動作していれば実際の環境でも動くと思います。

最後までお読みくださり、誠にありがとうございます。

WordPressユーザーのためのPHP入門はじめから、ていねいに。[第3版]
WordPressオリジナルテーマ制作入門

関連投稿

週間アクセスランキング

このブログを書いている人

管理者 ほんだ

数多くあるブログの中で、このページをお読みくださりありがとうございます。このブログは、炭火で美味しいものを作ることを中心に、日々の趣味についてを文章にすることで、WordPressを使ってのWebページ作成を忘れないようにしています。熱帯魚の世話や野菜の栽培、Linuxについて興味のあることを、つたない文章で綴っています。兵庫県在住です。