true ) ); // Unread, a post type would make get_posts() read the site's posts and the print folder would be the uploads folder. $printblob_named = static function ( $name ): bool { return is_string( $name ) && '' !== $name; }; if ( ! is_array( $printblob_stored ) || ! $printblob_named( $printblob_stored['post_types']['mockup'] ?? null ) || ! $printblob_named( $printblob_stored['post_types']['design'] ?? null ) || ! $printblob_named( $printblob_stored['print_folder'] ?? null ) ) { return; } foreach ( $printblob_stored['options'] as $printblob_option ) { delete_option( $printblob_option ); } foreach ( $printblob_stored['transients'] as $printblob_transient ) { delete_transient( $printblob_transient ); } foreach ( $printblob_stored['transient_prefixes'] as $printblob_prefix ) { $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->options} WHERE option_name LIKE %s OR option_name LIKE %s", $wpdb->esc_like( '_transient_' . $printblob_prefix ) . '%', $wpdb->esc_like( '_transient_timeout_' . $printblob_prefix ) . '%' ) ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- Uninstall: the hourly design-save counters carry a hash and the hour in their names, no API deletes transients by prefix, and nothing is cached afterwards. } foreach ( $printblob_stored['cron_hooks'] as $printblob_hook ) { wp_clear_scheduled_hook( $printblob_hook ); } foreach ( $printblob_stored['user_meta'] as $printblob_user_meta ) { delete_metadata( 'user', 0, $printblob_user_meta, '', true ); } // Every post of a type, or every attachment of a post, by ID. $printblob_all = array( 'post_status' => 'any', 'numberposts' => -1, 'fields' => 'ids', ); foreach ( get_posts( array( 'post_type' => $printblob_stored['post_types']['mockup'] ) + $printblob_all ) as $printblob_mockup ) { wp_delete_post( $printblob_mockup, true ); } if ( defined( 'PRINTBLOB_REMOVE_ALL_DATA' ) && PRINTBLOB_REMOVE_ALL_DATA ) { foreach ( get_posts( array( 'post_type' => $printblob_stored['post_types']['design'] ) + $printblob_all ) as $printblob_design ) { $printblob_previews = get_children( array( 'post_parent' => $printblob_design, 'post_type' => 'attachment', ) + $printblob_all ); foreach ( $printblob_previews as $printblob_preview ) { wp_delete_attachment( $printblob_preview, true ); } wp_delete_post( $printblob_design, true ); } $printblob_uploads = wp_upload_dir(); $printblob_dir = trailingslashit( $printblob_uploads['basedir'] ) . $printblob_stored['print_folder']; if ( is_dir( $printblob_dir ) ) { require_once ABSPATH . 'wp-admin/includes/file.php'; WP_Filesystem(); global $wp_filesystem; $wp_filesystem->delete( $printblob_dir, true ); } foreach ( $printblob_stored['post_meta'] as $printblob_post_meta ) { delete_metadata( 'post', 0, $printblob_post_meta, '', true ); } foreach ( $printblob_stored['post_meta_prefixes'] as $printblob_prefix ) { $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->postmeta} WHERE meta_key LIKE %s", $wpdb->esc_like( $printblob_prefix ) . '%' ) ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- Uninstall: one key per side and other plugins add sides, so the keys are not known here; nothing is cached afterwards. } foreach ( $printblob_stored['term_meta'] as $printblob_term_meta ) { delete_metadata( 'term', 0, $printblob_term_meta, '', true ); } }