esc_like('adsd_') . '%'; // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- Uninstall script requires direct queries $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->usermeta} WHERE meta_key LIKE %s", $like ) ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- Uninstall script requires direct queries $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->options} WHERE option_name LIKE %s", $like ) ); // Transients live under a prefixed option name, so they need their own masks. // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- Uninstall script requires direct queries $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->options} WHERE option_name LIKE %s OR option_name LIKE %s", '_transient_' . $wpdb->esc_like('adsd_') . '%', '_transient_timeout_' . $wpdb->esc_like('adsd_') . '%' ) ); } /** * Delete every log directory the plugin could have created. * * The directory name contains a salt-derived suffix, so the whole uploads root * is scanned by prefix instead of guessing the current name. * * @since 1.0.29 */ function adsd_uninstall_log_directories(): void { $uploads = wp_get_upload_dir(); $basedir = $uploads['basedir'] ?? ''; if ($basedir === '' || !is_dir($basedir)) { return; } $directories = glob($basedir . '/ads-destroyer-logs*', GLOB_ONLYDIR); if (!is_array($directories)) { return; } foreach ($directories as $directory) { // scandir() is used instead of glob() so the .htaccess guard is included. $entries = scandir($directory); if (is_array($entries)) { foreach ($entries as $entry) { if ($entry === '.' || $entry === '..') { continue; } if (is_file($directory . '/' . $entry)) { wp_delete_file($directory . '/' . $entry); } } } // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_rmdir -- WP_Filesystem is not available during uninstall @rmdir($directory); } } if (is_multisite()) { delete_site_option('adsd_new_network_options'); foreach (get_sites(['fields' => 'ids']) as $adsd_site_id) { switch_to_blog((int) $adsd_site_id); adsd_uninstall_current_site(); adsd_uninstall_log_directories(); restore_current_blog(); } } else { adsd_uninstall_current_site(); adsd_uninstall_log_directories(); }