HOME / BLOG
BLOG

WordPressでGoogle Analytics Data APIを毎日自動取得してDBへ保存する方法

デフォルト画像

アクセス解析ダッシュボードを安定して動かすなら、Google Analytics Data APIを表示のたびに叩くより、毎日自動取得してDBへ保存する構成がおすすめです。API制限、表示速度、過去比較のしやすさが大きく変わります。

なぜDB保存するのか

  • ページ表示が速くなる
  • API障害時も過去データを表示できる
  • 前日比・前週比・前月比を計算しやすい
  • AI解析や急上昇検出の材料にできる

テーブルを作る

function nines_create_daily_metrics_table(): void
{
    global $wpdb;

    $table = $wpdb->prefix . 'nines_daily_metrics';
    $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,
        pageviews INT UNSIGNED NOT NULL DEFAULT 0,
        sessions INT UNSIGNED NOT NULL DEFAULT 0,
        clicks INT UNSIGNED NOT NULL DEFAULT 0,
        impressions INT UNSIGNED NOT NULL DEFAULT 0,
        avg_position DECIMAL(6,2) DEFAULT NULL,
        created_at DATETIME NOT NULL,
        PRIMARY KEY (id),
        UNIQUE KEY metric_page_date (metric_date, page_path)
    ) {$charset};";

    require_once ABSPATH . 'wp-admin/includes/upgrade.php';
    dbDelta($sql);
}

WP-Cronで毎日取得する

アクセスが少ないサイトではWP-Cronの実行が遅れることがあります。本気で運用するならサーバーCronからwp cron event runを呼ぶ構成も検討します。

add_action('init', function () {
    if (!wp_next_scheduled('nines_fetch_daily_analytics')) {
        wp_schedule_event(strtotime('tomorrow 03:10'), 'daily', 'nines_fetch_daily_analytics');
    }
});

add_action('nines_fetch_daily_analytics', 'nines_store_daily_analytics');

function nines_store_daily_analytics(): void
{
    global $wpdb;

    $table = $wpdb->prefix . 'nines_daily_metrics';
    $yesterday = wp_date('Y-m-d', strtotime('yesterday'));
    $rows = nines_fetch_ga_and_gsc_rows($yesterday);

    foreach ($rows as $row) {
        $wpdb->replace($table, [
            'metric_date' => $yesterday,
            'page_path' => $row['page_path'],
            'pageviews' => $row['pageviews'],
            'sessions' => $row['sessions'],
            'clicks' => $row['clicks'],
            'impressions' => $row['impressions'],
            'avg_position' => $row['avg_position'],
            'created_at' => current_time('mysql'),
        ], ['%s', '%s', '%d', '%d', '%d', '%d', '%f', '%s']);
    }
}

保存時の注意点

  • 日付とURLでユニーク制約を作る
  • 同じ日の再取得はinsertではなくreplace/updateにする
  • APIレスポンスをそのまま保存せず必要な列に絞る
  • 秘密鍵は公開ディレクトリに置かない
  • 失敗ログを残して翌日に気づけるようにする

関連リンク

まとめ

毎日DBへ保存する構成にしておくと、アクセス解析は一気に扱いやすくなります。リアルタイム性より、比較できる蓄積データを作ることを優先すると、記事改善に使えるダッシュボードへ近づきます。