cache_path = trailingslashit( $cache_path ); $this->config_path = $config_path; $this->rucss_usedcss_table = $rucss_usedcss_table; $this->rocket_cache = $rocket_cache; } /** * Deletes all plugin data and files on uninstall. * * @since 3.5.2 * @author Remy Perona * * @return void */ public function uninstall() { $this->delete_plugin_data(); $this->delete_cache_files(); $this->delete_config_files(); $this->drop_rucss_database_tables(); $this->delete_preload_table(); } /** * Drop RUCSS database tables. * * @return void */ private function drop_rucss_database_tables() { // If the table exist, then drop the table. $this->drop_rucss_current_site_tables(); if ( ! is_multisite() ) { return; } foreach ( get_sites( [ 'fields' => 'ids' ] ) as $site_id ) { switch_to_blog( $site_id ); $this->drop_rucss_current_site_tables(); restore_current_blog(); } } /** * Drop RUCSS tables for current active site. */ private function drop_rucss_current_site_tables() { if ( $this->rucss_usedcss_table->exists() ) { $this->rucss_usedcss_table->uninstall(); } } /** * Deletes WP Rocket options, transients and events. * * @since 3.5.2 * @author Remy Perona * * @return void */ private function delete_plugin_data() { delete_site_transient( 'wp_rocket_update_data' ); // Delete all user meta related to WP Rocket. delete_metadata( 'user', '', 'rocket_boxes', '', true ); // Delete all post meta related to WP Rocket. foreach ( $this->post_meta as $post_meta ) { delete_post_meta_by_key( "_rocket_exclude_{$post_meta}" ); } array_walk( $this->transients, 'delete_transient' ); array_walk( $this->options, 'delete_option' ); foreach ( $this->events as $event ) { wp_clear_scheduled_hook( $event ); } } /** * Deletes all WP Rocket cache files. * * @since 3.5.2 * @author Remy Perona * * @return void */ private function delete_cache_files() { foreach ( $this->cache_dirs as $dir ) { $this->delete( $this->cache_path . $dir ); } } /** * Deletes all WP Rocket config files. * * @since 3.5.2 * @author Remy Perona * * @return void */ private function delete_config_files() { $this->delete( $this->config_path ); } /** * Drop preload tables. */ private function delete_preload_table() { // If the table exist, then drop the table. if ( $this->rocket_cache->exists() ) { $this->rocket_cache->uninstall(); } if ( ! is_multisite() ) { return; } foreach ( get_sites( [ 'fields' => 'ids' ] ) as $site_id ) { switch_to_blog( $site_id ); if ( $this->rocket_cache->exists() ) { $this->rocket_cache->uninstall(); } restore_current_blog(); } } /** * Recursively deletes files and directories. * * @since 3.5.2 * @author Remy Perona * * @param string $file Path to file or directory. */ private function delete( $file ) { if ( ! is_dir( $file ) ) { @unlink( $file ); //phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged return; } try { $iterator = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $file, FilesystemIterator::SKIP_DOTS ), RecursiveIteratorIterator::CHILD_FIRST ); } catch ( UnexpectedValueException $e ) { return; } foreach ( $iterator as $item ) { if ( $item->isDir() ) { @rmdir( $item ); //phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged continue; } @unlink( $item ); //phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged } @rmdir( $file ); //phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged } }