DBを使用してAPIのコール制限(WordPress-PHP)

コード

動作の詳細

テーブル名を決定

・$wpdb->prefix → WordPress のテーブル接頭辞(多くは "wp_")。
・その後ろに "api_call_log" を足すので、最終的にテーブル名は例:wp_api_call_log になる。

文字コード・照合順序の取得

・WordPress のデータベース設定に従って、適切な文字コード (utf8mb4_unicode_ci など) を取得。
・テーブル作成時に文字化けしないようにするため。

CREATE TABLE のSQL文を準備

IF NOT EXISTS → すでにテーブルがあれば何もしない。
・id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT
→ ログ1件ごとのユニークID。自動的に1から順番に振られる。
・call_time DATETIME NOT NULL
→ APIコールが行われた時間を記録するカラム。
・PRIMARY KEY (id)
→ id をテーブルの主キーに設定。

このテーブルの用途

  • API を呼び出したタイムスタンプを保存することで、
    • 「直近1分間に何回呼び出したか」
    • 「10分ごとのコール数」
    • 「1日の合計回数」
      などを SQL クエリで集計できるようになる。

① require_once(ABSPATH . 'wp-admin/includes/upgrade.php');

  • 目的:WordPress の「データベース操作ユーティリティ」を読み込むため。
  • 特に dbDelta() という関数を使うために必要です。

dbDelta() とは?

  • WordPress が提供する テーブル作成・更新用の関数
  • SQL を解釈して、テーブルが存在しなければ作成、あればスキーマを更新してくれる。
  • 普通の mysqli_query() では「テーブルが無ければエラー」になるので、それを安全に扱うために WordPress では dbDelta() を推奨。

👉 つまり、この require_once は「WordPress 標準のテーブル作成ユーティリティを使う準備」と考えればOKです。

② $wpdb->prepare("SELECT COUNT(*) FROM $table_name WHERE call_time >= %s", $one_minute_ago)

これは SQLインジェクション対策付きのSQL文作成処理です。

流れ

1. SQLの雛形

  • %s はプレースホルダ(文字列用)。
  • 後で安全に値が埋め込まれる。

2.  置き換え

には例えば "2025-09-14 09:20:00" のような文字列が入っている。
これが %s にバインドされて安全なSQLが生成される。

3.  最終的なSQL

という形になる。

4. $wpdb->get_var(...)

  • SQL を実行して「単一の値(この場合は件数)」を返す。
  • 例えば 5 が返れば「直近1分で 5 回 API コールされた」という意味。

👉 まとめると:

  • require_once(...) → dbDelta() を使うために必要。
  • $wpdb->prepare(...) → SQL を安全に組み立てる。COUNT(*) で「直近1分間のコール数」を数えている。

コメント

タイトルとURLをコピーしました