get_col( $wpdb->prepare( 'SHOW TABLES LIKE %s', $spinix_like ) ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery foreach ( (array) $spinix_tables as $spinix_table ) { $spinix_safe = preg_replace( '/[^A-Za-z0-9_$]/', '', (string) $spinix_table ); if ( '' !== $spinix_safe ) { $wpdb->query( 'DROP TABLE IF EXISTS `' . esc_sql( $spinix_safe ) . '`' ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery, WordPress.DB.PreparedSQL.NotPrepared, PluginCheck.Security.DirectDB.UnescapedDBParameter -- Table name is restricted to [A-Za-z0-9_$] and escaped; identifiers cannot use prepare() placeholders before WP 6.2. } } } // Resolve folders exactly like the plugin does (no hard-coded paths). require_once __DIR__ . '/includes/class-spinix-env.php'; require_once __DIR__ . '/includes/class-spinix-paths.php'; require_once __DIR__ . '/includes/class-spinix-storage.php'; $spinix_base = Spinix_Storage::base_dir(); $spinix_rm = function ( $dir ) use ( &$spinix_rm ) { if ( ! is_dir( $dir ) || is_link( $dir ) ) { @unlink( $dir ); // phpcs:ignore return; } foreach ( (array) scandir( $dir ) as $item ) { if ( '.' === $item || '..' === $item ) { continue; } $spinix_rm( $dir . '/' . $item ); } @rmdir( $dir ); // phpcs:ignore }; foreach ( array( '.jobs', '.logs', '.rollback', 'exports' ) as $spinix_sub ) { $spinix_rm( $spinix_base . '/' . $spinix_sub ); } $spinix_mu = Spinix_Paths::mu_plugins(); @unlink( $spinix_mu . '/spinix-restore-guard.php' ); // phpcs:ignore