@g-lanzi Proviamo in questo modo:
Per esempio la funzione wc_get_order( $the_order = false ) mi ritorna @return bool|WC_Order|WC_Order_Refund vedi che già qui abbiamo 3 controlli da fare:
Idem avremmo dovuto fare per $order_id, usare wc_get_order non ti da nessuna sicurezza sul risultato, troppe variabili, puoi benissimo rimanere su $order_id e fare il check su questo, ora so che la documentazione ti dice così ma siccome io non mi fido di nessuno e voglio essere sicuro al limite della paranoia che il risultato sia quello aspettato verifico tutto, come ho detto sono paranoico ma questo mi assicura di lavorare meno dopo.
Torniamo a cosa vogliamo che sia $order_id, cosa ci promette la documentazione? Ci promette un integer o un post? Se parliamo di \WC_Order ci promette un integer https://woocommerce.github.io/code-reference/classes/WC-Data.html#method_get_id
Quindi o mettiamo un type nella signature, int in questo caso:
function aggiorna_campi_acf( int $order_id ) {}Ma questo ti potrebbe generare un TypeError da PHP https://www.php.net/manual/en/class.typeerror.php
Che però sarebbe il sistema best practice.
O fai un banalissimo:
function aggiorna_campi_acf( $order_id ){ if( ! \is_int( $order_id ) ) { // E qui ritorni un errore o qualcosa che ti indichi il problema // Non fare altro, ritorna subito } ... il resto del tuo codice }Poi abbiamo il caso che l'ID sia 0, e come sappiamo 0 non esiste come post quindi devo controllare anche questo, raro ma può capitare.
Volendo potresti fare un casting di $order_id su int:
function aggiorna_campi_acf( $order_id ){ $order_id= (int) $order_id; ... il resto del tuo codice }In quest'ultimo caso verifica che l'ìID non sia 0 perche se ti passano valori strani hai uno 0.
@g-lanzi ha detto in WooCommerce API: ordine senza alcuni metadati:
Adesso non dovrei avere problemi.
Non possiamo saperlo.
@g-lanzi ha detto in WooCommerce API: ordine senza alcuni metadati:
Se la thank you page non viene visualizzata, ma l'ordine creato, come detto anche prima, ho un filtro nell'algoritmo che coglie questa cosa e pone rimedio.
A che livello hai questo check?
@g-lanzi ha detto in WooCommerce API: ordine senza alcuni metadati:
I campi sono creati da ACF e il plugin ha questo comportamento per cui non salva i campi a meno che non venga usata l'azione acf/save_post, che però non scatta alla creazione dell'ordine, ma quando viene salvato il post. (https://www.advancedcustomfields.com/resources/acf-save_post/).
Tutti i fields sono slavati al salvataggio del post, è un comportamento normale di WP, ma quindi sono a livello di prodotto e non di ordine? Perché i fields che l'utente compila (indirizzo e così via) vengono salvati ad ogni ordine.
@g-lanzi ha detto in WooCommerce API: ordine senza alcuni metadati:
Quindi, il fatto che i metadati ACF non siano subito disponibili è un comportamento atteso, che ho aggirato con lo snippet qui sopra.
Ma tu lo aggiri a valle, non a monte. se tu metti un default nella risposta non hai neanche bisogno di salvare nulla.
@g-lanzi ha detto in WooCommerce API: ordine senza alcuni metadati:
Per quello che riguarda i test, sono stati effettuati in un sito di test con le medesime impostazioni, da cui venivano estratti i dati ordine tramite API. Forse non la più elegante delle soluzioni, ma in fondo funzionale :-). Quello che potevo testare senza scrivere codice che avrebbe potuto rompere il sito, lo facevo in produzione.
Quelli non sono i test di cui parlo, io dico questo genere di test fatti per esempio con PHPUnit https://phpunit.de/