esc_like( 'wpstream_' ) . '%', $wpdb->esc_like( 'wp_estate_' ) . '%', $wpdb->esc_like( 'wp_stream_' ) . '%', $wpdb->esc_like( '_transient_free_event_streamName_' ) . '%', $wpdb->esc_like( '_transient_timeout_free_event_streamName_' ) . '%', $wpdb->esc_like( '_transient_paid_event_streamName_' ) . '%', $wpdb->esc_like( '_transient_timeout_paid_event_streamName_' ) . '%', $wpdb->esc_like( '_transient_wpstream_' ) . '%', $wpdb->esc_like( '_transient_timeout_wpstream_' ) . '%', $wpdb->esc_like( '_transient_' ) . '%' . $wpdb->esc_like( '_api20_streamName' ), $wpdb->esc_like( '_transient_timeout_' ) . '%' . $wpdb->esc_like( '_api20_streamName' ), $wpdb->esc_like( '_transient_vod_decryption_key_index_' ) . '%', $wpdb->esc_like( '_transient_timeout_vod_decryption_key_index_' ) . '%', $wpdb->esc_like( '_transient_paid_vod_key_index_' ) . '%', $wpdb->esc_like( '_transient_timeout_paid_vod_key_index_' ) . '%', $wpdb->esc_like( '_transient_event_data_to_return_' ) . '%', $wpdb->esc_like( '_transient_timeout_event_data_to_return_' ) . '%', $wpdb->esc_like( '_transient_server_id_to_return_' ) . '%', $wpdb->esc_like( '_transient_timeout_server_id_to_return_' ) . '%', ); $wpstream_option_conditions = implode( ' OR ', array_fill( 0, count( $wpstream_option_patterns ), 'option_name LIKE %s' ) ); $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->options} WHERE {$wpstream_option_conditions}", $wpstream_option_patterns ) ); // User-specific state is normally prefixed; the BuddyBoss integration also // shipped one legacy misspelled key which remains plugin-owned. $wpstream_usermeta_patterns = array( $wpdb->esc_like( 'wpstream_' ) . '%', $wpdb->esc_like( 'budyboss_selected_channel' ), ); $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->usermeta} WHERE meta_key LIKE %s OR meta_key LIKE %s", $wpstream_usermeta_patterns ) ); // Authored content is valuable, so delete it only for this site's opt-in. if ( $wpstream_delete_content ) { $wpstream_content_ids = get_posts( array( 'post_type' => array( 'wpstream_product', 'wpstream_product_vod', 'wpstream_bundles' ), 'post_status' => 'any', 'numberposts' => -1, 'fields' => 'ids', 'suppress_filters' => true, ) ); foreach ( $wpstream_content_ids as $wpstream_content_id ) { wp_delete_post( (int) $wpstream_content_id, true ); } } }; if ( is_multisite() ) { $wpstream_site_ids = get_sites( array( 'fields' => 'ids', 'number' => 0, ) ); foreach ( $wpstream_site_ids as $wpstream_site_id ) { switch_to_blog( (int) $wpstream_site_id ); try { $wpstream_cleanup_current_site(); } finally { restore_current_blog(); } } } else { $wpstream_cleanup_current_site(); } // Streamify creates only generated cache data here, so the complete directory // may be removed. Files are traversed child-first to support nested cache paths. $wpstream_cache_dir = WP_CONTENT_DIR . '/uploads/wpstreamify_cache'; if ( is_dir( $wpstream_cache_dir ) ) { $wpstream_cache_items = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $wpstream_cache_dir, FilesystemIterator::SKIP_DOTS ), RecursiveIteratorIterator::CHILD_FIRST ); foreach ( $wpstream_cache_items as $wpstream_cache_item ) { if ( $wpstream_cache_item->isDir() && ! $wpstream_cache_item->isLink() ) { rmdir( $wpstream_cache_item->getPathname() ); } else { unlink( $wpstream_cache_item->getPathname() ); } } rmdir( $wpstream_cache_dir ); }