exists( $file ) ) { $wp_filesystem->delete( $file ); } } // Remove IndexNow key file (dynamic name) if ( ! empty( $settings['indexnow_key'] ) ) { $key_file = $airewp_root . $settings['indexnow_key'] . '.txt'; if ( $wp_filesystem->exists( $key_file ) ) { $wp_filesystem->delete( $key_file ); } } // Remove .well-known dir if empty $well_known = $airewp_root . '.well-known/'; if ( $wp_filesystem->is_dir( $well_known ) && count( (array) $wp_filesystem->dirlist( $well_known ) ) === 0 ) { $wp_filesystem->rmdir( $well_known ); } // Clear scheduled crons wp_clear_scheduled_hook( 'airewp_cron_regenerate' ); // Clean up SEO post meta global $wpdb; $seo_meta_keys = [ '_airewp_seo_title', '_airewp_seo_desc', '_airewp_seo_keyword', '_airewp_seo_noindex', '_airewp_seo_nofollow', '_airewp_seo_canonical', ]; $placeholders = implode( ',', array_fill( 0, count( $seo_meta_keys ), '%s' ) ); $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->postmeta} WHERE meta_key IN ($placeholders)", // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared $seo_meta_keys ) ); // 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' ); // Clean up transients $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->options} WHERE option_name LIKE %s OR option_name LIKE %s", '_transient_airewp_%', '_transient_timeout_airewp_%' ) );