query( $wpdb->prepare( 'DROP TABLE IF EXISTS %i', $wpdb->prefix . 'spinxqm_queue' ) ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange -- Intentional teardown: drop the plugin's own table on uninstall; prepared (%i). $wpdb->query( $wpdb->prepare( 'DROP TABLE IF EXISTS %i', $wpdb->prefix . 'spinxqm_audit_log' ) ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange -- Intentional teardown: drop the plugin's own table on uninstall; prepared (%i). // Sweep any leftover job transients (they normally expire on their own). $wpdb->query( "DELETE FROM {$wpdb->options} WHERE option_name LIKE '_transient_spinxqm_job_%' OR option_name LIKE '_transient_timeout_spinxqm_job_%'" ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- One-shot uninstall cleanup of the plugin's own transients. // Storage folder (per site on multisite: uploads/sites/{id}/spinx-quick-migrate). $spinxqm_uploads = wp_get_upload_dir(); $spinxqm_base = wp_normalize_path( (string) ( $spinxqm_uploads['basedir'] ?? '' ) ); $spinxqm_storage = trailingslashit( $spinxqm_base ) . 'spinx-quick-migrate'; if ( '' !== $spinxqm_base && is_dir( $spinxqm_storage ) ) { require_once ABSPATH . 'wp-admin/includes/class-wp-filesystem-base.php'; require_once ABSPATH . 'wp-admin/includes/class-wp-filesystem-direct.php'; $spinxqm_fs = new WP_Filesystem_Direct( null ); $spinxqm_fs->delete( $spinxqm_storage, true, 'd' ); } }; if ( is_multisite() ) { foreach ( get_sites( array( 'fields' => 'ids', 'number' => 0, ) ) as $spinxqm_blog_id ) { switch_to_blog( (int) $spinxqm_blog_id ); $spinxqm_uninstall_site(); restore_current_blog(); } delete_site_transient( 'spinxqm_sibling_deactivated' ); } else { $spinxqm_uninstall_site(); } // Find & replace staging tables left by an abandoned job ({base_prefix}spinxqm_fr_* / // {base_prefix}spinxqm_fro_*) — shared by all sites, so dropped once. global $wpdb; foreach ( array( 'spinxqm_fr_', 'spinxqm_fro_' ) as $spinxqm_tag ) { $spinxqm_tables = $wpdb->get_col( $wpdb->prepare( 'SHOW TABLES LIKE %s', $wpdb->esc_like( $wpdb->base_prefix . $spinxqm_tag ) . '%' ) ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- One-shot uninstall: find the plugin's own staging tables. foreach ( (array) $spinxqm_tables as $spinxqm_table ) { $wpdb->query( $wpdb->prepare( 'DROP TABLE IF EXISTS %i', $spinxqm_table ) ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange -- Intentional teardown of the plugin's own staging tables; prepared (%i). } }