query($wpdb->prepare('DROP TABLE IF EXISTS %i', $table)); $backups = $wpdb->get_col($wpdb->prepare('SHOW TABLES LIKE %s', $wpdb->esc_like($table . '_bak_v') . '%')); foreach ((array) $backups as $backup) { $wpdb->query($wpdb->prepare('DROP TABLE IF EXISTS %i', (string) $backup)); } } // Tables of features that left the plugin, if an upgrade did not drop them yet. \Llamly\Free\Core\Schema::dropRetired(); // Media retention copies (uploads/llamly-mcp/). Their index rows (llamly_free_mret_*) go with the options below. $llamlyFreeUploads = wp_upload_dir(null, false); $llamlyFreeBase = realpath((string) ($llamlyFreeUploads['basedir'] ?? '')); $llamlyFreeDir = $llamlyFreeBase ? realpath($llamlyFreeBase . '/llamly-mcp') : false; if ($llamlyFreeBase && $llamlyFreeDir && strpos($llamlyFreeDir, $llamlyFreeBase . DIRECTORY_SEPARATOR) === 0 && is_dir($llamlyFreeDir) && !is_link($llamlyFreeDir)) { $llamlyFreeItems = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($llamlyFreeDir, FilesystemIterator::SKIP_DOTS), RecursiveIteratorIterator::CHILD_FIRST); foreach ($llamlyFreeItems as $llamlyFreeItem) { if ($llamlyFreeItem->isDir() && !$llamlyFreeItem->isLink()) { \Llamly\Free\Core\Filesystem::direct()->rmdir($llamlyFreeItem->getPathname()); } else { wp_delete_file($llamlyFreeItem->getPathname()); } } \Llamly\Free\Core\Filesystem::direct()->rmdir($llamlyFreeDir); } $like = $wpdb->esc_like('llamly_free_') . '%'; $timeout = $wpdb->esc_like('_transient_timeout_llamly_free_') . '%'; $transient = $wpdb->esc_like('_transient_llamly_free_') . '%'; $siteTimeout = $wpdb->esc_like('_site_transient_timeout_llamly_free_') . '%'; $siteTransient = $wpdb->esc_like('_site_transient_llamly_free_') . '%'; $wpdb->query($wpdb->prepare( "DELETE FROM {$wpdb->options} WHERE option_name LIKE %s OR option_name LIKE %s OR option_name LIKE %s OR option_name LIKE %s OR option_name LIKE %s", $like, $timeout, $transient, $siteTimeout, $siteTransient )); $wpdb->query($wpdb->prepare("DELETE FROM {$wpdb->usermeta} WHERE meta_key LIKE %s", $like)); wp_clear_scheduled_hook('llamly_free_daily_maintenance'); wp_cache_flush(); }; if (is_multisite()) { foreach (get_sites(['fields' => 'ids', 'number' => 0]) as $llamlyFreeBlogId) { switch_to_blog((int) $llamlyFreeBlogId); $llamlyFreeUninstallSite(); restore_current_blog(); } global $wpdb; $wpdb->query($wpdb->prepare("DELETE FROM {$wpdb->sitemeta} WHERE meta_key LIKE %s", $wpdb->esc_like('llamly_free_') . '%')); } else { $llamlyFreeUninstallSite(); }