コード
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
<?php // APIコール制御関数 function my_check_and_log_api_call() { global $wpdb; // 制限値 $limit = 60; // 1分あたり60回 $interval = 60; // 秒 (1分) $table_name = $wpdb->prefix . "api_call_log"; // テーブルがなければ作成(初回のみ実行される) $charset_collate = $wpdb->get_charset_collate(); $sql = "CREATE TABLE IF NOT EXISTS $table_name ( id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, call_time DATETIME NOT NULL, PRIMARY KEY (id) ) $charset_collate;"; require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); dbDelta($sql); // 現在時刻 $now = current_time('mysql'); $one_minute_ago = date('Y-m-d H:i:s', strtotime($now) - $interval); // ① 古いログを削除(1分より前のデータ) $wpdb->query( $wpdb->prepare("DELETE FROM $table_name WHERE call_time < %s", $one_minute_ago) ); // ② 直近1分間のAPIコール数を数える $count = $wpdb->get_var( $wpdb->prepare("SELECT COUNT(*) FROM $table_name WHERE call_time >= %s", $one_minute_ago) ); if ($count >= $limit) { // 制限超過 → false を返す return false; } // ③ ログに追加(成功した場合のみ) $wpdb->insert( $table_name, array('call_time' => $now), array('%s') ); return true; // コールOK } |
動作の詳細
テーブル名を決定
|
1 |
$table_name = $wpdb->prefix . "api_call_log"; |
・$wpdb->prefix → WordPress のテーブル接頭辞(多くは "wp_")。
・その後ろに "api_call_log" を足すので、最終的にテーブル名は例:wp_api_call_log になる。
文字コード・照合順序の取得
|
1 |
$charset_collate = $wpdb->get_charset_collate(); |
・WordPress のデータベース設定に従って、適切な文字コード (utf8mb4_unicode_ci など) を取得。
・テーブル作成時に文字化けしないようにするため。
CREATE TABLE のSQL文を準備
|
1 2 3 4 5 |
CREATE TABLE IF NOT EXISTS wp_api_call_log ( id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, call_time DATETIME NOT NULL, PRIMARY KEY (id) ) utf8mb4_unicode_ci; |
・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の雛形
|
1 |
SELECT COUNT(*) FROM wp_api_call_log WHERE call_time >= %s |
%sはプレースホルダ(文字列用)。- 後で安全に値が埋め込まれる。
2. 置き換え
|
1 |
$one_minute_ago |
には例えば "2025-09-14 09:20:00" のような文字列が入っている。
これが %s にバインドされて安全なSQLが生成される。
3. 最終的なSQL
|
1 |
SELECT COUNT(*) FROM wp_api_call_log WHERE call_time >= '2025-09-14 09:20:00' |
という形になる。
4. $wpdb->get_var(...)
- SQL を実行して「単一の値(この場合は件数)」を返す。
- 例えば
5が返れば「直近1分で 5 回 API コールされた」という意味。
👉 まとめると:
require_once(...)→dbDelta()を使うために必要。$wpdb->prepare(...)→ SQL を安全に組み立てる。COUNT(*)で「直近1分間のコール数」を数えている。

コメント