query( $wpdb->prepare( "DELETE FROM {$wpdb->options} WHERE option_name LIKE %s OR option_name LIKE %s", '%_transient_aegilock_%', '%_transient_timeout_aegilock_%' ) ); // Drop custom database tables $tables_to_drop = array( $wpdb->prefix . 'aegilock_wc_fraud_logs', $wpdb->prefix . 'aegilock_wc_stats', ); foreach ( $tables_to_drop as $table ) { // Escape table name for security - table names can't use prepare() placeholders in WP < 6.2 $escaped_table = esc_sql( $table ); $wpdb->query( "DROP TABLE IF EXISTS `{$escaped_table}`" ); } // Clear scheduled events wp_clear_scheduled_hook( 'aegilock_wc_daily_cleanup' ); // Remove order meta data $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->postmeta} WHERE meta_key LIKE %s", '%_aegilock_%' ) ); // Remove user meta data (dismissed notices, etc) $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->usermeta} WHERE meta_key LIKE %s", '%aegilock%' ) ); // Remove ALL remaining aegilock options (catch-all) $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->options} WHERE option_name LIKE %s", '%aegilock%' ) ); // Clear any cached data wp_cache_flush(); // Remove upload directory if exists $upload_dir = wp_upload_dir(); $plugin_upload_dir = $upload_dir['basedir'] . '/aegilock'; if ( is_dir( $plugin_upload_dir ) ) { // Use WP_Filesystem for directory operations require_once ABSPATH . 'wp-admin/includes/file.php'; WP_Filesystem(); global $wp_filesystem; if ( $wp_filesystem ) { $wp_filesystem->rmdir( $plugin_upload_dir, true ); } }