query( // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- per-user transients have no list API; one-off cleanup. $wpdb->prepare( "DELETE FROM {$wpdb->options} WHERE option_name LIKE %s OR option_name LIKE %s", $wpdb->esc_like( '_transient_yomanalytics_' ) . '%', $wpdb->esc_like( '_transient_timeout_yomanalytics_' ) . '%' ) ); // 3. Queued deliveries would otherwise run (and fail) after the plugin is gone. if ( function_exists( 'as_unschedule_all_actions' ) ) { as_unschedule_all_actions( 'yomanalytics_send' ); } wp_unschedule_hook( 'yomanalytics_send' ); // 4. Order meta, batched, in every table WooCommerce may keep order meta in. $yomanalytics_meta_tables = array( $wpdb->postmeta ); $yomanalytics_hpos_meta = $wpdb->prefix . 'wc_orders_meta'; if ( $wpdb->get_var( $wpdb->prepare( 'SHOW TABLES LIKE %s', $wpdb->esc_like( $yomanalytics_hpos_meta ) ) ) === $yomanalytics_hpos_meta ) { // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- one-off check at uninstall. $yomanalytics_meta_tables[] = $yomanalytics_hpos_meta; } foreach ( $yomanalytics_meta_tables as $yomanalytics_table ) { do { $yomanalytics_deleted = $wpdb->query( // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- batched one-off cleanup. $wpdb->prepare( 'DELETE FROM %i WHERE meta_key IN (%s, %s) LIMIT %d', $yomanalytics_table, '_yomanalytics_purchase_sent', '_yomanalytics_consent', 1000 ) ); } while ( $yomanalytics_deleted > 0 ); } if ( function_exists( 'wp_cache_flush_group' ) ) { wp_cache_flush_group( 'orders' ); }