prefix ) as $table_name ) { // Table names cannot be bound as placeholders, and every name here comes // from a class constant joined to the current site's prefix. Dropping // the schema is the whole point of an opted-in uninstall. // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.SchemaChange, WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching $wpdb->query( "DROP TABLE IF EXISTS `{$table_name}`" ); } } /** * Deletes the options and transients the plugin writes. * * @return void */ function epicforms_uninstall_delete_options() { $options = [ 'epicforms_settings', 'epicforms_show_made_by', 'epic_forms_user_info', 'epicforms_submission_token_secret', 'epicforms_db_version', ]; foreach ( $options as $option ) { delete_option( $option ); } $transients = [ 'epic_forms_code_verifier', 'epic_forms_connection_valid', 'epic_forms_oauth_state', ]; foreach ( $transients as $transient ) { delete_transient( $transient ); } } /** * Deletes the plugin's uploads directory: logs, CSV exports and files * submitted through the file upload field. * * @return void */ function epicforms_uninstall_delete_uploads() { $upload_dir = wp_upload_dir(); if ( ! empty( $upload_dir['error'] ) || empty( $upload_dir['basedir'] ) ) { return; } $base_dir = realpath( $upload_dir['basedir'] ); $plugin_dir = realpath( $upload_dir['basedir'] . '/epicforms' ); if ( false === $base_dir || false === $plugin_dir ) { return; } // The uploads path is filterable, so make sure the resolved directory still // sits inside the uploads root before recursively deleting anything. if ( 0 !== strpos( $plugin_dir . DIRECTORY_SEPARATOR, trailingslashit( $base_dir ) ) ) { return; } if ( ! function_exists( 'WP_Filesystem' ) ) { require_once ABSPATH . 'wp-admin/includes/file.php'; } global $wp_filesystem; // Without direct filesystem access there are no credentials to prompt for // during uninstall, so leave the files rather than fall back to raw // unlink()/rmdir() calls. if ( ! WP_Filesystem() || ! $wp_filesystem instanceof WP_Filesystem_Base ) { return; } $wp_filesystem->delete( $plugin_dir, true ); } /** * Clears the hourly pending-values purge cron event. * * @return void */ function epicforms_uninstall_clear_cron() { wp_clear_scheduled_hook( 'epicforms_purge_pending_values' ); } if ( is_multisite() ) { $epicforms_site_ids = get_sites( [ 'fields' => 'ids', 'number' => 0, 'update_site_meta_cache' => false, ] ); foreach ( $epicforms_site_ids as $epicforms_site_id ) { switch_to_blog( $epicforms_site_id ); epicforms_uninstall_site(); restore_current_blog(); } unset( $epicforms_site_ids, $epicforms_site_id ); } else { epicforms_uninstall_site(); }