Regional > Data), so deleting the plugin by mistake never loses orders. if (!defined('WP_UNINSTALL_PLUGIN')) exit; global $wpdb; $gatecraft_prefix = $wpdb->prefix . 'gatecraft_'; // phpcs:ignore WordPress.DB.DirectDatabaseQuery -- plugin's own settings table, read once during uninstall. $gatecraft_wanted = $wpdb->get_var($wpdb->prepare('SELECT v FROM %i WHERE k = %s', $gatecraft_prefix . 'settings', 'delete_data_on_uninstall')); wp_clear_scheduled_hook('gatecraft_worker'); wp_clear_scheduled_hook('gatecraft_worker', ['soon']); if ($gatecraft_wanted !== '1') return; // phpcs:disable WordPress.DB.DirectDatabaseQuery -- removing the plugin's own tables at the admin's request. $wpdb->query('SET FOREIGN_KEY_CHECKS = 0'); // Every table Gatecraft and Gatecraft Pro create (the same list as GATECRAFT_TABLES in includes/install.php). foreach (['waitlist', 'event_series', 'segments', 'campaigns', 'contacts', 'trusted_browsers', 'counters', 'rate_limits', 'audit_log', 'notifications', 'email_queue', 'checkin_scans', 'tickets', 'order_items', 'orders', 'discounts', 'event_questions', 'event_announcements', 'event_sponsors', 'ticket_tiers', 'ticket_categories', 'events', 'venue_sections', 'venues', 'settings', 'sessions', 'accounts'] as $gatecraft_t) { $wpdb->query($wpdb->prepare('DROP TABLE IF EXISTS %i', $gatecraft_prefix . $gatecraft_t)); } $wpdb->query('SET FOREIGN_KEY_CHECKS = 1'); // phpcs:enable remove_role('gatecraft_manager'); remove_role('gatecraft_checkin'); foreach (wp_roles()->role_objects as $gatecraft_role) foreach (['gatecraft_checkin', 'gatecraft_manage', 'gatecraft_admin'] as $gatecraft_cap) $gatecraft_role->remove_cap($gatecraft_cap); foreach (['gatecraft_db_version', 'gatecraft_flush_rewrites', 'gatecraft_sheets_status'] as $gatecraft_opt) delete_option($gatecraft_opt); delete_metadata('user', 0, 'gatecraft_pro_notice_dismissed', '', true); delete_transient('gatecraft_google_jwks'); $gatecraft_dir = wp_upload_dir(null, false)['basedir'] . '/gatecraft'; if (is_dir($gatecraft_dir)) { foreach (glob($gatecraft_dir . '/{,.}*', GLOB_BRACE) ?: [] as $gatecraft_f) if (is_file($gatecraft_f)) wp_delete_file($gatecraft_f); global $wp_filesystem; if (!function_exists('WP_Filesystem')) require_once ABSPATH . 'wp-admin/includes/file.php'; if (WP_Filesystem()) $wp_filesystem->rmdir($gatecraft_dir); }