HOME / BLOG
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任せにしてアクセスが少ない日に取得が遅れる

関連リンク

参考資料

まとめ

Cron対応でDBへ保存する構成にしておくと、Analytics Data APIのデータは「見るだけの数字」から「加工できる資産」になります。まずは前日分のPVを日次保存し、次にSearch ConsoleやAI解析へつなげるのが現実的です。