exists( $airewp_file ) ) { $airewp_fs->delete( $airewp_file ); } } // Remove IndexNow key file (dynamic name) if ( ! empty( $airewp_settings['indexnow_key'] ) ) { $airewp_key_file = $airewp_root . $airewp_settings['indexnow_key'] . '.txt'; if ( $airewp_fs->exists( $airewp_key_file ) ) { $airewp_fs->delete( $airewp_key_file ); } } // Remove .well-known dir if empty $airewp_well_known = $airewp_root . '.well-known/'; if ( $airewp_fs->is_dir( $airewp_well_known ) && count( (array) $airewp_fs->dirlist( $airewp_well_known ) ) === 0 ) { $airewp_fs->rmdir( $airewp_well_known ); } } // Clear scheduled crons wp_clear_scheduled_hook( 'airewp_cron_regenerate' ); // Clean up SEO post meta via core API (no direct SQL) $airewp_seo_meta_keys = [ '_airewp_seo_title', '_airewp_seo_desc', '_airewp_seo_keyword', '_airewp_seo_noindex', '_airewp_seo_nofollow', '_airewp_seo_canonical', ]; foreach ( $airewp_seo_meta_keys as $airewp_meta_key ) { delete_post_meta_by_key( $airewp_meta_key ); } // Remove options (AFTER file cleanup, since we needed indexnow_key above) delete_option( 'airewp_settings' ); delete_option( 'airewp_crawler_stats' ); delete_option( 'airewp_crawler_log' ); delete_option( 'airewp_sitemap_last_generated' ); delete_option( 'airewp_generated_version' ); delete_option( 'airewp_write_status' ); delete_option( 'airewp_robots_migrated' ); delete_option( 'airewp_robots_notice' ); delete_option( 'airewp_seo_yielding' ); delete_transient( 'airewp_upgrade_rebuild' ); delete_transient( 'airewp_ondemand_rebuild' ); // Clean up transients. Plugin transients use dynamic suffixes (caches, // rate-limit buckets), so a LIKE query on the options table is the only // way to remove them all — core has no wildcard transient API. One-time // cleanup at uninstall, caching is irrelevant here. global $wpdb; $wpdb->query( // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching $wpdb->prepare( "DELETE FROM {$wpdb->options} WHERE option_name LIKE %s OR option_name LIKE %s", '_transient_airewp_%', '_transient_timeout_airewp_%' ) );