query("DELETE FROM {$wpdb->options} WHERE option_name LIKE '\_transient\_aiutoma\_%' OR option_name LIKE '\_site\_transient\_aiutoma\_%'"); // 3. Delete Custom Tables $custom_tables = [ $wpdb->prefix . 'document_embeddings', $wpdb->prefix . 'aiutoma_oauth_clients', $wpdb->prefix . 'aiutoma_oauth_tokens', $wpdb->prefix . 'aiutoma_request_logs', ]; foreach ($custom_tables as $table) { // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.SchemaChange, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.DirectQuery $wpdb->query("DROP TABLE IF EXISTS `" . esc_sql($table) . "`"); } delete_option('aiutoma_oauth_db_version'); delete_option('aiutoma_skills_migrated_to_cpt'); // 4. Delete Custom Post Types (aiutoma_task, aiutoma_skill) $post_types = ['aiutoma_task', 'aiutoma_skill']; foreach ($post_types as $pt) { $cpt_posts = get_posts([ 'post_type' => $pt, 'numberposts' => -1, 'post_status' => 'any', ]); if (!empty($cpt_posts)) { foreach ($cpt_posts as $p) { wp_delete_post($p->ID, true); // Force delete } } } });