Woocommerce: Associare gli utenti registrati ai vecchi ordini

Mi è capitato di attivare la registrazione degli utenti su un Woocommerce che fino ad allora aveva accettato ordini solo da guest. Dopo un po’ di tempo è nata l’esigenza di associare i vecchi ordini agli utenti che man mano si registravano.

Ho cercato dei plugin che potessero fare questa operazione ma non ne ho trovati, ho risolto generando degli UPDATE da lanciare direttamente su SQL.

 

Un primo approccio è quello di estrarre i vari ordini e associarli agli utenti esistenti. Woocommerce memorizza gli ordini come se fossero dei post, la tabella di riferimento è quindi la solita wp_postmeta. Per ogni ordine ci sono vari metadati tra cui _billing_email che identifica l’indirizzo email dell’acquirente e _customer_user che corrisponde all’id utente (oppure 0 se si tratta di un guest).

Non ci resta che cercare tutti gli ordini con _customer_user=0, estrapolare l’indirizzo email e vedere se c’è una corrispondenza con un utente registrato. Un primo approccio può essere questo:

A questo punto non ci resta che fare una ricerca:

SELECT
  e.post_id, 
  m.meta_value,
  u.ID 
FROM 
  wp_postmeta AS e 
INNER JOIN 
  wp_postmeta AS m ON m.post_id = e.post_id
INNER JOIN
  wp_users AS u ON u.user_email = m.meta_value
WHERE
  e.meta_key = '_customer_user' AND
  e.meta_value LIKE '0' AND
  m.meta_key='_billing_email' ;

Da qui possiamo lavorare per ottenere una query che vada a modificare i dati, ad esempio ho usato questa query per generare degli UPDATE (che andranno poi esportati ed eseguiti manualmente):

SELECT
  CONCAT(
    "UPDATE wp_postmeta SET meta_value = ",
    u.ID,
    " WHERE post_id = ",
    e.post_id,
    " AND meta_key = '_customer_user' ;"
    ) AS query
FROM
  wp_postmeta AS e
INNER JOIN
   wp_postmeta AS m ON m.post_id = e.post_id
INNER JOIN
   wp_users AS u ON u.user_email = m.meta_value
WHERE
   e.meta_key = '_customer_user' AND
   e.meta_value LIKE '0' AND 
   m.meta_key='_billing_email' ;

Questa query mi ha generato una serie di righe come questa:

UPDATE wp_postmeta SET meta_value = 19 WHERE post_id = 6073 AND meta_key = '_customer_user' ;

che ho poi eseguito come nuova query per modificare i dati.

Non sono un esperto di SQL, probabilmente si può fare tutto con una query singola, ma ho preferito generare degli UPDATE da lanciare poi manualmente. Questa soluzione mi ha permesso di associare gli ordini pregressi agli utenti registrati.

La prossima ottimizzazione che vorrei ottenere è  quella di automatizzare il processo quando un utente si registra ed aveva già degli ordini pregressi, appena possibile scriverò un plugin per gestire questa casistica.

Nota importante: il codice che ho indicato va considerato sperimentale, sconsiglio di usarlo in ambienti di produzione senza averlo testato prima in ambienti staging e sopratutto fate sempre un backup prima di qualunque modifica!

L’ho testato con Woocommerce 4.2.2, versioni diverse potrebbero avere strutture dati diverse e quindi questo approccio potrebbe non essere corretto.