all() as $connection ) { try { $factory->for_connection( $connection )->revoke(); } catch ( \Throwable $e ) { // Unreadable or unfinished connection: nothing to revoke. unset( $e ); } } TurtleReport\Support\TransientStore::delete_all(); foreach ( array( 'turtlereport_connections', 'turtlereport_secrets', 'turtlereport_profiles', 'turtlereport_cache_versions', 'turtlereport_version', 'turtlereport_settings', 'turtlereport_email_log', 'turtlereport_health', 'turtlereport_daily_ran', 'turtlereport_cron_heartbeat', 'turtlereport_cron_failures', 'turtlereport_daily_lock' ) as $option ) { delete_option( $option ); } wp_clear_scheduled_hook( 'turtlereport_hourly' ); wp_unschedule_hook( 'turtlereport_send_report' ); // Cached responses, tokens and notices are transients with our prefixes. // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- One-time cleanup on uninstall. $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", $wpdb->esc_like( '_transient_tly_' ) . '%', $wpdb->esc_like( '_transient_timeout_tly_' ) . '%', $wpdb->esc_like( '_transient_turtlereport_' ) . '%', $wpdb->esc_like( '_transient_timeout_turtlereport_' ) . '%' ) ); // Delivery history and report runs. TurtleReport\Delivery\Schema::drop(); // Leftover send locks. // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- One-time cleanup on uninstall. $wpdb->query( $wpdb->prepare( 'DELETE FROM %i WHERE option_name LIKE %s OR option_name LIKE %s OR option_name LIKE %s', $wpdb->options, $wpdb->esc_like( 'turtlereport_mail_lock_' ) . '%', $wpdb->esc_like( 'turtlereport_write_' ) . '%', $wpdb->esc_like( 'turtlereport_oauth_claim_' ) . '%' ) ); delete_metadata( 'user', 0, $wpdb->get_blog_prefix() . 'turtlereport_site', '', true ); foreach ( get_users( array( 'role' => 'turtlereport_viewer', 'fields' => 'ID', 'number' => 0, ) ) as $user_id ) { $user = new \WP_User( (int) $user_id ); $user->remove_role( 'turtlereport_viewer' ); } remove_role( 'turtlereport_viewer' ); } if ( is_multisite() ) { foreach ( get_sites( array( 'fields' => 'ids', 'number' => 0, ) ) as $turtlereport_blog_id ) { switch_to_blog( $turtlereport_blog_id ); turtlereport_uninstall_site(); restore_current_blog(); } } else { turtlereport_uninstall_site(); } // Display preferences (theme, sidebar) are per user, not per site. delete_metadata( 'user', 0, 'turtlereport_theme', '', true ); delete_metadata( 'user', 0, 'turtlereport_sidebar', '', true );