get_charset_collate(); $scans = "CREATE TABLE {$wpdb->prefix}wpag_scans ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, scan_uuid CHAR(36) NOT NULL, url TEXT NOT NULL, status VARCHAR(16) NOT NULL DEFAULT 'queued', score TINYINT UNSIGNED NULL, wcag_level VARCHAR(8) NOT NULL DEFAULT 'AA', issues_count INT UNSIGNED NOT NULL DEFAULT 0, raw_payload LONGTEXT NULL, created_at DATETIME NOT NULL, completed_at DATETIME NULL, PRIMARY KEY (id), UNIQUE KEY scan_uuid (scan_uuid), KEY status (status), KEY created_at (created_at) ) $charset_collate;"; $issues = "CREATE TABLE {$wpdb->prefix}wpag_issues ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, scan_id BIGINT UNSIGNED NOT NULL, rule_id VARCHAR(80) NOT NULL, impact VARCHAR(16) NOT NULL, selector TEXT NOT NULL, html TEXT NULL, help_url VARCHAR(255) NULL, fixed TINYINT(1) NOT NULL DEFAULT 0, fix_method VARCHAR(40) NULL, PRIMARY KEY (id), KEY scan_id (scan_id), KEY impact (impact) ) $charset_collate;"; $statements = "CREATE TABLE {$wpdb->prefix}wpag_statements ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, version INT UNSIGNED NOT NULL, language VARCHAR(5) NOT NULL, status VARCHAR(20) NOT NULL, pdf_url VARCHAR(500) NULL, pdf_hash CHAR(64) NULL, signed_at DATETIME NULL, created_at DATETIME NOT NULL, PRIMARY KEY (id), KEY language (language) ) $charset_collate;"; dbDelta( $scans ); dbDelta( $issues ); dbDelta( $statements ); update_option( 'wpag_db_version', self::SCHEMA_VERSION ); } /** * Drop all custom tables – called from uninstall.php only. */ public static function drop(): void { global $wpdb; $tables = [ $wpdb->prefix . 'wpag_scans', $wpdb->prefix . 'wpag_issues', $wpdb->prefix . 'wpag_statements', ]; foreach ( $tables as $table ) { $wpdb->query( "DROP TABLE IF EXISTS {$table}" ); // phpcs:ignore WordPress.DB } } }