get_charset_collate(); require_once ABSPATH . 'wp-admin/includes/upgrade.php'; // wp_formii_forms テーブル $table_forms = $wpdb->prefix . 'formii_forms'; $sql_forms = "CREATE TABLE {$table_forms} ( id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, form_name VARCHAR(255) NOT NULL COMMENT 'フォーム名', form_config TEXT NOT NULL COMMENT 'JSON: フィールド定義、バリデーション、設定', shortcode VARCHAR(100) NOT NULL COMMENT '例: [formii_form id=\"1\"]', status VARCHAR(20) NOT NULL DEFAULT 'draft' COMMENT 'published, draft', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '作成日時', updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新日時', deleted_at DATETIME DEFAULT NULL COMMENT 'ソフトデリート日時(NULLは未削除)', PRIMARY KEY (id), UNIQUE KEY idx_shortcode (shortcode), KEY idx_status (status), KEY idx_created_at (created_at), KEY idx_deleted_at (deleted_at) ) {$charset_collate} COMMENT='フォーム定義テーブル';"; dbDelta( $sql_forms ); // wp_formii_inquiries テーブル $table_inquiries = $wpdb->prefix . 'formii_inquiries'; $sql_inquiries = "CREATE TABLE {$table_inquiries} ( id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, form_id BIGINT(20) UNSIGNED NOT NULL COMMENT '外部キー: wp_formii_forms.id', form_name_snapshot VARCHAR(255) DEFAULT NULL COMMENT '送信時点のフォーム名(フォーム削除後の表示用)', inquiry_data TEXT NOT NULL COMMENT 'JSON: フォーム送信データ', sender_name VARCHAR(255) NOT NULL COMMENT '送信者名', sender_email VARCHAR(255) NOT NULL COMMENT '送信者メールアドレス', ip_address VARCHAR(45) DEFAULT NULL COMMENT '送信元IPアドレス(IPv6対応)', user_agent TEXT DEFAULT NULL COMMENT 'User-Agent文字列', status VARCHAR(50) NOT NULL DEFAULT 'unread' COMMENT 'unread, read', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '送信日時', PRIMARY KEY (id), KEY idx_form_id (form_id), KEY idx_sender_email (sender_email), KEY idx_status (status), KEY idx_created_at (created_at) ) {$charset_collate} COMMENT='問い合わせデータテーブル';"; dbDelta( $sql_inquiries ); // wp_formii_attachments テーブル // (ファイル添付処理は Formii Pro が担うが、テーブルスキーマは memos と同様に // 無料コアが用意する。アップロード保存・取得・メール添付は Pro 側へ委譲済み)。 $table_attachments = $wpdb->prefix . 'formii_attachments'; $sql_attachments = "CREATE TABLE {$table_attachments} ( id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, inquiry_id BIGINT(20) UNSIGNED NOT NULL COMMENT '外部キー: wp_formii_inquiries.id', file_name VARCHAR(255) NOT NULL COMMENT 'ファイル名', file_path VARCHAR(500) NOT NULL COMMENT 'wp-content/uploadsからの相対パス', file_size BIGINT(20) UNSIGNED NOT NULL COMMENT 'ファイルサイズ(バイト)', mime_type VARCHAR(100) NOT NULL COMMENT 'MIMEタイプ', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'アップロード日時', deleted_at DATETIME NULL DEFAULT NULL COMMENT '保存期間経過による自動削除日時(NULL=有効)', PRIMARY KEY (id), KEY idx_inquiry_id (inquiry_id), KEY idx_retention (deleted_at, created_at) ) {$charset_collate} COMMENT='添付ファイルテーブル';"; dbDelta( $sql_attachments ); // wp_formii_memos テーブル $table_memos = $wpdb->prefix . 'formii_memos'; $sql_memos = "CREATE TABLE {$table_memos} ( id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, inquiry_id BIGINT(20) UNSIGNED NOT NULL COMMENT '外部キー: wp_formii_inquiries.id', user_id BIGINT(20) UNSIGNED NOT NULL COMMENT '作成者(WordPressユーザーID)', memo_text TEXT NOT NULL COMMENT '内部メモ内容', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '作成日時', PRIMARY KEY (id), KEY idx_inquiry_id (inquiry_id), KEY idx_user_id (user_id) ) {$charset_collate} COMMENT='内部メモテーブル';"; dbDelta( $sql_memos ); // wp_formii_custom_statuses テーブルは Formii Pro のアクティベーションで作成する // (カスタムステータスは有料機能のため無料コアはテーブルを作らない). } /** * すべてのカスタムテーブルを削除 * * プラグイン削除時に使用します(アンインストール時)。 * * @since 1.0.0 */ public static function drop_tables() { global $wpdb; $tables = array( $wpdb->prefix . 'formii_forms', $wpdb->prefix . 'formii_inquiries', $wpdb->prefix . 'formii_attachments', $wpdb->prefix . 'formii_memos', ); foreach ( $tables as $table ) { // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared $wpdb->query( "DROP TABLE IF EXISTS {$table}" ); } } }