query( "DELETE FROM {$wpdb->postmeta} WHERE meta_key LIKE '_activetrail_%'" ); // Remove custom user meta // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- Direct query needed for uninstall cleanup $wpdb->query( "DELETE FROM {$wpdb->usermeta} WHERE meta_key LIKE '_activetrail_%'" ); // Drop custom tables $table_name = $wpdb->prefix . 'activetrail_cart_tracking'; // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching,WordPress.DB.DirectDatabaseQuery.SchemaChange,WordPress.DB.PreparedSQL.InterpolatedNotPrepared,PluginCheck.Security.DirectDB.UnescapedDBParameter -- Direct query needed for uninstall, table name is safe (built from $wpdb->prefix) $wpdb->query( "DROP TABLE IF EXISTS {$table_name}" ); // Clear scheduled events wp_clear_scheduled_hook( 'activetrail_sync_abandoned_carts' ); wp_clear_scheduled_hook( 'activetrail_clean_expired_coupons' ); // Remove transients // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- Direct query needed for uninstall cleanup $wpdb->query( "DELETE FROM {$wpdb->options} WHERE option_name LIKE '_transient_activetrail_%'" ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- Direct query needed for uninstall cleanup $wpdb->query( "DELETE FROM {$wpdb->options} WHERE option_name LIKE '_transient_timeout_activetrail_%'" ); // Remove ActiveTrail coupons (optional - user might want to keep them) $remove_coupons = get_option( 'activetrail_remove_coupons_on_uninstall', false ); if ( $remove_coupons ) { // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching,WordPress.DB.SlowDBQuery.slow_db_query_meta_key,WordPress.DB.SlowDBQuery.slow_db_query_meta_value -- Direct query needed for uninstall cleanup $coupon_ids = $wpdb->get_col( "SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = '_activetrail_coupon' AND meta_value = 'yes'" ); foreach ( $coupon_ids as $coupon_id ) { wp_delete_post( $coupon_id, true ); } } // Flush rewrite rules flush_rewrite_rules(); // Log uninstall (if debug mode was enabled) // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log -- Uninstall script, logger may not be available if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) { // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log -- Uninstall script, logger may not be available error_log( '[ActiveTrail WC] Plugin uninstalled and data cleaned up' ); } } // Run uninstall activetrail_wc_uninstall();