'tflexforms_form', 'post_status' => 'any', 'numberposts' => 100, 'fields' => 'ids', ) ); foreach ( $ids as $id ) { if ( ! wp_delete_post( (int) $id, true ) ) { break 2; // Stop rather than loop forever if a delete fails. } } } while ( array() !== $ids ); delete_option( 'tflexforms_version' ); delete_option( 'tflexforms_settings' ); delete_option( 'tflexforms_captcha_warning' ); delete_option( 'tflexforms_db_version' ); delete_option( 'tflexforms_schema_migration' ); delete_option( 'tflexforms_upload_key' ); delete_option( 'tflexforms_uploads_encrypted' ); delete_metadata( 'user', 0, 'tflexforms_entries_per_page', '', true ); delete_metadata( 'user', 0, 'tflexforms_onboarding_dismissed', '', true ); delete_metadata( 'user', 0, 'tflexforms_review_answer', '', true ); delete_option( 'tflexforms_review_ready' ); // Stored entries (custom tables). global $wpdb; foreach ( array( 'tflexforms_entry_tags', 'tflexforms_entry_notes', 'tflexforms_jobs', 'tflexforms_submission_keys', 'tflexforms_entry_files', 'tflexforms_entry_values', 'tflexforms_entries' ) as $table ) { // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange -- Removing our own tables. $wpdb->query( $wpdb->prepare( 'DROP TABLE IF EXISTS %i', $wpdb->prefix . $table ) ); } // Uploaded files. $dir = defined( 'TFLEXFORMS_UPLOAD_DIR' ) && '' !== (string) TFLEXFORMS_UPLOAD_DIR ? untrailingslashit( (string) TFLEXFORMS_UPLOAD_DIR ) : untrailingslashit( (string) wp_upload_dir( null, false )['basedir'] ) . '/tflexforms-uploads'; if ( is_dir( $dir ) && ! is_link( $dir ) ) { $items = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $dir, FilesystemIterator::SKIP_DOTS ), RecursiveIteratorIterator::CHILD_FIRST ); foreach ( $items as $item ) { if ( $item->isDir() && ! $item->isLink() ) { rmdir( $item->getPathname() ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_rmdir } else { wp_delete_file( $item->getPathname() ); } } rmdir( $dir ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_rmdir } $caps = array( 'edit_tflexforms_forms', 'edit_others_tflexforms_forms', 'edit_published_tflexforms_forms', 'edit_private_tflexforms_forms', 'publish_tflexforms_forms', 'read_private_tflexforms_forms', 'delete_tflexforms_forms', 'delete_others_tflexforms_forms', 'delete_published_tflexforms_forms', 'delete_private_tflexforms_forms', 'read_tflexforms_entries', 'edit_tflexforms_entries', 'delete_tflexforms_entries', ); foreach ( wp_roles()->role_objects as $role ) { foreach ( $caps as $cap ) { $role->remove_cap( $cap ); } } } if ( is_multisite() ) { foreach ( get_sites( array( 'fields' => 'ids', 'number' => 0, ) ) as $tflexforms_site_id ) { switch_to_blog( (int) $tflexforms_site_id ); tflexforms_uninstall_site(); restore_current_blog(); } } else { tflexforms_uninstall_site(); } // Rate-limit transients expire on their own (10 minutes) and need no cleanup.