HOME / BLOG
BLOG

WordPressでChart.jsを使ったアクセス解析ダッシュボードの作り方

デフォルト画像

WordPressでアクセス解析ダッシュボードを作るなら、数字の表だけでは少し物足りません。Chart.jsでPV・セッション・検索クリック・表示回数をグラフ化すると、どの日に伸びたか、検索流入とPVが連動しているかを見やすくできます。

作るもの

  • WordPress REST APIで日別データをJSON化する
  • Chart.jsでPVと検索クリックを折れ線グラフにする
  • 左右2軸でスケール差を吸収する
  • スマホでも崩れにくいグラフ枠を作る

REST APIでグラフ用JSONを返す

add_action('rest_api_init', function () {
    register_rest_route('nines/v1', '/analytics/chart', [
        'methods' => 'GET',
        'callback' => 'nines_get_analytics_chart_data',
        'permission_callback' => function () {
            return current_user_can('edit_posts');
        },
    ]);
});

function nines_get_analytics_chart_data(): WP_REST_Response
{
    global $wpdb;

    $ga_table = $wpdb->prefix . 'nines_ga_daily';
    $gsc_table = $wpdb->prefix . 'nines_gsc_daily';

    $rows = $wpdb->get_results("
        SELECT
          ga.metric_date AS date,
          SUM(ga.pageviews) AS pageviews,
          SUM(ga.sessions) AS sessions,
          COALESCE(SUM(gsc.clicks), 0) AS clicks,
          COALESCE(SUM(gsc.impressions), 0) AS impressions
        FROM {$ga_table} ga
        LEFT JOIN {$gsc_table} gsc
          ON ga.metric_date = gsc.metric_date
         AND ga.page_path = gsc.page_path
        WHERE ga.metric_date >= DATE_SUB(CURDATE(), INTERVAL 28 DAY)
        GROUP BY ga.metric_date
        ORDER BY ga.metric_date ASC
    ", ARRAY_A);

    return rest_ensure_response($rows);
}

HTML

<section class="analytics-panel">
  <header>
    <p>ANALYTICS</p>
    <h2>PVと検索流入の推移</h2>
  </header>

  <div class="chart-frame">
    <canvas id="analyticsChart"></canvas>
  </div>
</section>

JavaScript

Chart.jsでは、canvas要素に対してnew Chart()を実行します。PVと検索クリックは数字の桁が違いやすいので、左右2軸に分けると読みやすくなります。

async function renderAnalyticsChart() {
  const response = await fetch('/wp-json/nines/v1/analytics/chart');
  const rows = await response.json();

  const labels = rows.map((row) => row.date);

  new Chart(document.querySelector('#analyticsChart'), {
    type: 'line',
    data: {
      labels,
      datasets: [
        {
          label: 'PV',
          data: rows.map((row) => Number(row.pageviews)),
          borderColor: '#ff2f63',
          backgroundColor: 'rgba(255, 47, 99, .14)',
          tension: .35,
          fill: true,
          yAxisID: 'traffic',
        },
        {
          label: '検索クリック',
          data: rows.map((row) => Number(row.clicks)),
          borderColor: '#111',
          backgroundColor: 'rgba(17, 17, 17, .08)',
          tension: .35,
          yAxisID: 'search',
        },
      ],
    },
    options: {
      responsive: true,
      maintainAspectRatio: false,
      interaction: {
        mode: 'index',
        intersect: false,
      },
      scales: {
        traffic: {
          type: 'linear',
          position: 'left',
          beginAtZero: true,
        },
        search: {
          type: 'linear',
          position: 'right',
          beginAtZero: true,
          grid: {
            drawOnChartArea: false,
          },
        },
      },
    },
  });
}

renderAnalyticsChart();

CSS

.analytics-panel {
  padding: 24px;
  border: 2px solid #111;
  background: #fff;
  box-shadow: 8px 8px 0 #ffd93d;
}

.analytics-panel header p {
  margin: 0 0 4px;
  color: #ff2f63;
  font-weight: 800;
  letter-spacing: .08em;
}

.analytics-panel h2 {
  margin: 0 0 20px;
  font-size: clamp(24px, 4vw, 40px);
}

.chart-frame {
  position: relative;
  height: min(56vw, 420px);
  min-height: 280px;
}

見やすいダッシュボードにするコツ

  • グラフの期間とカードの期間を揃える
  • PVと検索クリックを同じ意味の線として見ない
  • 急上昇日には注釈や背景色を追加する
  • スマホでは横スクロールより縦積みを優先する
  • 管理者だけが見られるページにする

関連リンク

参考資料

まとめ

Chart.jsを使うと、AnalyticsとSearch Consoleのデータを直感的に比較できます。最初はPVと検索クリックの2本線だけで十分です。そこから表示回数、CTR、平均掲載順位を足していくと、編集判断に使えるダッシュボードになります。