BLOG
WordPressでGoogle Analytics Data APIをCronで毎日自動取得する方法
Google Analytics Data APIのデータは、その場で表示するだけでなく、WordPress側でCronを使って毎日自動取得しておくと一気に扱いやすくなります。日別のPV推移、前日比、記事別の伸び、AI解析の材料など、あとから加工できるからです。
この記事では、GA4のData APIで取得したPV・セッション・アクティブユーザーを、WP-Cronで毎日自動取得してDBへ保存する構成を作ります。
作る構成
- 日別・URL別に保存する独自テーブル
- Google Analytics Data APIから前日分を取得するPHP
- WP-Cronで毎日自動実行する処理
- WP-CLIで手動実行・確認する方法
- 失敗しやすいポイントの整理
テーブルを作る
function nines_create_ga_daily_table(): void
{
global $wpdb;
$table = $wpdb->prefix . 'nines_ga_daily';
$charset = $wpdb->get_charset_collate();
$sql = "CREATE TABLE {$table} (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
metric_date DATE NOT NULL,
page_path VARCHAR(255) NOT NULL,
page_title VARCHAR(255) NOT NULL DEFAULT '',
pageviews INT UNSIGNED NOT NULL DEFAULT 0,
sessions INT UNSIGNED NOT NULL DEFAULT 0,
active_users INT UNSIGNED NOT NULL DEFAULT 0,
created_at DATETIME NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY metric_date_page_path (metric_date, page_path)
) {$charset};";
require_once ABSPATH . 'wp-admin/includes/upgrade.php';
dbDelta($sql);
}Analytics Data APIから前日分を取得する
Google Analytics Data APIではrunReportを使って、pagePathやpageTitleなどのディメンションと、screenPageViews・sessions・activeUsersなどの指標を取得できます。
use Google\Analytics\Data\V1beta\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;
function nines_fetch_ga_daily_rows(string $date): array
{
$client = new BetaAnalyticsDataClient([
'credentials' => NINES_GA_CREDENTIALS,
]);
$request = (new RunReportRequest())
->setProperty('properties/' . NINES_GA4_PROPERTY_ID)
->setDateRanges([
new DateRange([
'start_date' => $date,
'end_date' => $date,
]),
])
->setDimensions([
new Dimension(['name' => 'pagePath']),
new Dimension(['name' => 'pageTitle']),
])
->setMetrics([
new Metric(['name' => 'screenPageViews']),
new Metric(['name' => 'sessions']),
new Metric(['name' => 'activeUsers']),
])
->setLimit(100);
$response = $client->runReport($request);
$rows = [];
foreach ($response->getRows() as $row) {
$dimensions = $row->getDimensionValues();
$metrics = $row->getMetricValues();
$rows[] = [
'metric_date' => $date,
'page_path' => $dimensions[0]->getValue(),
'page_title' => $dimensions[1]->getValue(),
'pageviews' => (int) $metrics[0]->getValue(),
'sessions' => (int) $metrics[1]->getValue(),
'active_users' => (int) $metrics[2]->getValue(),
];
}
return $rows;
}WP-Cronで毎日DBへ保存する
wp_schedule_eventは、指定時刻を過ぎたあとにサイトアクセスがあると実行されます。アクセスが少ないサイトでは、サーバーCronからWP-Cronを叩く構成も検討してください。
add_action('init', function () {
if (!wp_next_scheduled('nines_store_ga_daily_metrics')) {
wp_schedule_event(strtotime('tomorrow 03:15'), 'daily', 'nines_store_ga_daily_metrics');
}
});
add_action('nines_store_ga_daily_metrics', 'nines_store_ga_daily_metrics');
function nines_store_ga_daily_metrics(): void
{
global $wpdb;
$table = $wpdb->prefix . 'nines_ga_daily';
$date = wp_date('Y-m-d', strtotime('yesterday'));
$rows = nines_fetch_ga_daily_rows($date);
foreach ($rows as $row) {
$wpdb->replace($table, [
'metric_date' => $row['metric_date'],
'page_path' => $row['page_path'],
'page_title' => $row['page_title'],
'pageviews' => $row['pageviews'],
'sessions' => $row['sessions'],
'active_users' => $row['active_users'],
'created_at' => current_time('mysql'),
], ['%s', '%s', '%s', '%d', '%d', '%d', '%s']);
}
}WP-CLIで確認する
wp cron event run nines_store_ga_daily_metrics
wp cron event list | grep nines_store_ga_daily_metricsよくある失敗
- GA4の測定IDをプロパティIDとして使ってしまう
- サービスアカウントにGA4プロパティの閲覧権限を付けていない
- JSON鍵を公開ディレクトリへ置いてしまう
- 毎日insertして同じ日付のデータが重複する
- WP-Cron任せにしてアクセスが少ない日に取得が遅れる
関連リンク
- WordPressでGoogle Analytics Data APIを使ってPVを取得する方法
- WordPressでGoogle AnalyticsとSearch Consoleのデータを1画面にまとめる方法
- Chart.jsでGoogle AnalyticsとSearch Consoleのデータを可視化する方法
参考資料
まとめ
Cron対応でDBへ保存する構成にしておくと、Analytics Data APIのデータは「見るだけの数字」から「加工できる資産」になります。まずは前日分のPVを日次保存し、次にSearch ConsoleやAI解析へつなげるのが現実的です。