drop_tables(); // Cleanup queries below use internal $wpdb table names and $wpdb->prepare() // for all values. Direct queries are required for uninstall cleanup. // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.PreparedSQL.InterpolatedNotPrepared, PluginCheck.Security.DirectDB.UnescapedDBParameter // Delete every plugin option (all use the aicommerce_ prefix). Doing this by // prefix ensures newly added options are always cleaned up too. $aicommerce_option_names = $wpdb->get_col( $wpdb->prepare( "SELECT option_name FROM {$wpdb->options} WHERE option_name LIKE %s", 'aicommerce\_%' ) ); foreach ( (array) $aicommerce_option_names as $aicommerce_option_name ) { delete_option( $aicommerce_option_name ); } // Delete all transients with our prefix (site + multisite variants). $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->options} WHERE option_name LIKE %s OR option_name LIKE %s", '_transient_aicommerce_%', '_transient_timeout_aicommerce_%' ) ); if ( is_multisite() ) { $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->sitemeta} WHERE meta_key LIKE %s OR meta_key LIKE %s", '_site_transient_aicommerce_%', '_site_transient_timeout_aicommerce_%' ) ); } // Delete post meta created by the plugin. $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->postmeta} WHERE meta_key LIKE %s", '_aicommerce_%' ) ); // phpcs:enable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.PreparedSQL.InterpolatedNotPrepared, PluginCheck.Security.DirectDB.UnescapedDBParameter