delete` prépare la requête lui-même : aucun SQL écrit à la main, aucun nom de table * interpolé dans une chaîne. */ global $wpdb; $meta_keys = array_merge( array( '_convrail_pushed', '_convrail_landing_url', '_convrail_referrer', '_convrail_consent', '_convrail_session', '_convrail_status_report', '_convrail_status_attempt', ), array_keys( Convrail_Upgrade::LEGACY_ORDER_META ) ); $tables = array( $wpdb->postmeta ); $hpos = $wpdb->prefix . 'wc_orders_meta'; // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching -- désinstallation : vérification ponctuelle de l'existence de la table HPOS. if ( $wpdb->get_var( $wpdb->prepare( 'SHOW TABLES LIKE %s', $hpos ) ) === $hpos ) { $tables[] = $hpos; } foreach ( $tables as $table ) { foreach ( $meta_keys as $meta_key ) { // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching,WordPress.DB.SlowDBQuery.slow_db_query_meta_key -- désinstallation : aucune API WordPress ne supprime une métadonnée par clé sur tout le site. $wpdb->delete( $table, array( 'meta_key' => $meta_key ) ); } } } if ( is_multisite() ) { /* * Par paquets: un reseau peut compter des milliers de sites, et `get_sites()` sans limite les * chargerait tous d'un coup, dans une requete qui n'a droit qu'a la memoire habituelle de * WordPress. */ $convrail_batch = 200; $convrail_offset = 0; do { $convrail_sites = get_sites( array( 'number' => $convrail_batch, 'offset' => $convrail_offset, 'fields' => 'ids', ) ); $convrail_found = count( $convrail_sites ); foreach ( $convrail_sites as $convrail_site_id ) { switch_to_blog( (int) $convrail_site_id ); convrail_uninstall_site(); restore_current_blog(); } $convrail_offset += $convrail_batch; } while ( $convrail_found === $convrail_batch ); } else { convrail_uninstall_site(); }