• Moderatore

    WooCommerce API: ordine senza alcuni metadati

    #woocommerce #metadati #API
    Salve a tutti,
    ho impostato uno scenario su Integromat per collegare gli ordini di WC alle API di un servizio di logistica.
    Il tutto funziona sulla base degli stati ordine e di 2 custom fields che ho aggiunto agli ordini tramite ACF che flaggano se l'ordine è stato ritirato dal cliente e se, una volta completato, è stato poi re-inviato. In base ai flag, vengono create le due spedizioni, in entrata e in uscita, per il ritiro e la spedizione del prodotto.

    Questi flag sono tra i metadati dell'ordine e normalmente non ci sono problemi. Ma ogni tanto, l'ordine viene recuperato con dei metadati mancanti, tra cui quelli indispensabili per il funzionamento dell'automatismo. Non ho individuato un criterio per cui questo accada.

    Io non capisco come possa succedere che solo alcune volte i dati non sono inviati. Qualcuno ha un'idea di come potrei assicurarmi che quei metadati siano inviati?


    shazarak 1 Risposta
  • User Attivo

    @g-lanzi prova ad andare per esclusione intanto, si presume che da woocommerce escano es. 7 dati per entrare in integromat, trova un modo per verificare che escano sicuramente, mandali via mail, crea un log in php o roba simile
    se escono coi buchi il problema lo hai su wordpress. se invece escono sempre allora il problema può stare su Integromat

    su integromat l'unica cosa che mi venga in mente ora è che magari sta in attesa di dati che non arrivano serializzati nel modo giusto, o che in qualche modo arrivano in ordine diverso

    in quel caso li piazza su integromat dei flussi che facciano incetta dei dati per poterli analizzare, che ne so tipo il too text aggregator, oppure la funzione mail o te li spari su uno sheet o airtable o che altro sia

    altro possibile intoppo può forse essere il numero di invii o ricezioni? qui ignoro da entrambe le parti, quindi solo una ipotesi sparata, che ne so hai un limite da qualche parte per cui si impalla? ( anche se la vedo buia che perda solo dei metadati e non l'intero ordine)


    g.lanzi 1 Risposta
  • Moderatore

    @shazarak
    Ho delle nuove informazioni che potrebbero aiutare. I metadati nel gruppo sono 5:

    1. ID di tracciamento
    2. Url di tracciamento
    3. Ritiro prenotato
    4. Data del ritiro
    5. Spedizione prenotata

    I campi 3 e 5 sono checkbox con possibilità si / no. Impostati su no di default. Gli altri sono vuoti e vengono popolati dall'automatismo.

    Se un ordine arriva con i campi 3 e 5 mancanti, mancano anche gli altri. Quindi ho provato a mettere dei segnaposto - tanto poi i campi sono sovrascritti nel processo. Facendo questa modifica e richiedendo i dati dell'ordine, ci sono tutti.

    Ho quindi impostato in tutti i campi vuoti dei valori di default, sperando che questo equivalga alla modifica manuale in caso di mancato invio.

    Ora verifico i log, non ci avevo nemmeno pensato.

    Escluderei il limite di invii o ricezioni. Sono molto sotto al limite su Integromat e si parla di una richiesta al minuto al massimo nei momenti di punta da WC, direi che non è eccessivo. Inoltre, le richieste partono una alla volta.


    shazarak 1 Risposta
  • User Attivo

    @g-lanzi ahhhh ok! quindi se mancano due dati non arrivano gli altri è tipo un ciclo che si interrompe? a sto punto fai bene dargli un valore di default cosi sistemi l'invio dei dati


  • Moderatore

    Non sapendo com'è stata fatta l'implementazione mi sento solo di condividere alcune accortezze per evitare che non succeda in futuro.

    La prima accorteza è quella di scrivere degli unit test sul codice che si scrive, gli unit test ci aiutano anche in futuro se dobbiamo fare modifiche, gli unit test in pratica verificano che il nostro codice funzioni nelle varie situazioni che possono succedere.

    La seconda accortezza è quella di avere sempre un default ai dati che vogliamo inviare da A a B, se parliamo di array per esempio le chiavi devono sempre essere definite e i valori vuoti.

    La terza accortezza è per esempio lanciare un'eccezione in caso qualcosa vada storto, noi possiamo catturare l'eccezione e registrarla dove riteniamo più opportuno.


  • Moderatore

    @shazarak In realtà continua ad accadere anche se ho impostato dei valori di default.

    @overclokk Non ho scritto i campi personalizzati, ma ho usato ACF.

    La cosa che non mi spiego è come mai a volte i campi sono passati alle API e altre volte no.

    Al momento va così: se un nuovo ordine viene creato, questo triggera un webhook che passa il numero ordine su Integromat a un modulo che recupera, via API, le informazioni dell'ordine.
    Se queste informazioni sono manchevoli dei metadati che mi servono, mi viene comunicato e lo scenario su Integromat non prosegue perché un filtro blocca l'esecuzione.

    Allora io vado sull'ordine, manualmente modifico uno dei campi testo che ho elencato sopra, per esempio il numero di tracciamento, aggiungendo un trattino. Torno su Integromat, faccio ripartire il recupero ordine e questo ha tutti i metadati.

    La cosa che mi fa impazzire è che non succede sempre, ma solo a volte. Domani provo a programmare i campi via plugin e vedo se le cose cambiano.
    Farò anche dei testi richiamando le API da un servizio come reqbin.com.


  • Moderatore

    Ho testato un nuovo ordine appena arrivato e ho fatto una richiesta API per i dettagli. Mancano alcuni metadati.

    Ho aperto l'ordine e ho semplicemente cliccato su aggiorna. Fatta nuovamente la richiesta, ecco i metadati disponibili.

    Sembrerebbe che i metadati di ACF siano disponibili solo dopo aver aggiornato l'ordine e non appena creato.


  • Moderatore

    Dopo varie prove ho capito che il problema si pone con i nuovi ordini.

    Il problema è che i metadati creati da ACF, non sono salvati fintanto che non si va ad aggiornare l'ordine dalla pagina dell'ordine stesso (Provando ad aggiornare l'ordine tramite API il problema persiste).

    Solo a quel punto, i metadati sono disponibili anche tramite API.

    Se avete idee su come fare, sono tutt'orecchi.

    I campi devono essere modificabili da un amministratore nella pagina dell'ordine.


    shazarak 1 Risposta
  • User Attivo

    @g-lanzi eh alora, il problema suppongo sia relativo a come vengono salvati questi metadati da acf nell'ordine

    come lo hai costruito il flusso? nel senso i campi ACF sono text? dove compaiono? che codice usi per salvarli e in quale momento?

    fai una prova se puoi, invece che mandare in salvataggio il presunto dato compilato, mettigli un valore fisso ( quindi sovrascrivi la variabile con un valore di test) e prova a fare un ordine, manca sempre quel metadato? oppure te lo ritrovi?
    se te lo ritrovi il problema sarà nel passaggio dalla compilazione al salvataggio, se non lo ritrovi il problema sta, suppongo, nel momento in cui devi salvare il dato a database


    g.lanzi 1 Risposta
  • Moderatore

    @g-lanzi Ma hai la versione di sviluppo in locale?


    g.lanzi 1 Risposta
  • Moderatore

    @shazarak
    I campi ACF che mi interessano sono dei booleani, quindi vengono passati (quando sono passati) con 0 e 1.

    Ho già provato ad usare dei dati fissi, ma mancano comunque tutti i metadati di ACF.

    Ho apperentemente risolto così: prima di recuperare i dati dell'ordine, imposto tutti i metadati che mi servono con i valori di default anche su Integromat. Questo fa sì che l'automatismo funzioni ma anche che i metadati, richiamati con il loro nome corretto, vengano popolati come dovrebbero.

    In fase di test tutto bene, vediamo sul campo...

    Comunque sia, i metadati ACF non sono salvati con l'ordine come i gli indirizzi, per esempio. Questo viene detto in vari articoli e richieste di aiuto online. Purtroppo la soluzione non sembra così semplice come mi aspettavo.

    Spero di risolvere questa cosa con ACF, anche solo per avere una soluzione ufficiale al salvataggio dei metadati custom dell'ordine.

    Vi tengo aggiornati per completezza


    shazarak 1 Risposta
  • Moderatore

    @overclokk
    No, non ho una versione in locale, sto recuperando i dati dagli ordini in arrivo e all'occorrenza faccio un ordine.


    overclokk 1 Risposta
  • User Attivo

    @g-lanzi scusa ma non capisco una roba

    usi due campi checkbox ACF per salvare dei metadati, dove vengono selezionati questi due checkbox? nel backend della gestione ordini?

    e poi se su integromat usi un modulo per recuperare un ordine e sai gia che acf non li memorizza li, è normale che non te li recupera, allora tanto vale fare due cose:

    1. dici ad integromat, dopo aver recupearto l'ordine, di recuperare i campi acf legati a quell'ordine ( e la cosa mi sembra macchinosa cosi a pelle)
      oppure
    2. fai in modo che quando integromat ciuccia i dati dell'ordine ci siano anche i due campi voluti

    ed è qui che non capisco, ma sti due checkbox dove e chi li compila?


    g.lanzi 1 Risposta
  • Moderatore

    @shazarak
    Il trigger dell'automatismo è il cambio di stato dell'ordine (abbiamo anche degli status custom per i servizi che offriamo).

    I due checkbox hanno valore 0 di default.
    L'automatismo crea una spedizione in arrivo (da cliente a negozio) quando l'ordine contenente una certa categoria di prodotti è su stato processing. La spedizione viene richiesta al servizio di logistica e vengono generati tutti i documenti necessari e inviati a chi di dovere.
    Come ultima cosa, Integromat segnala che ha creato la spedizione in arrivo.

    Quando l'ordine viene messo su completed, avviene la stessa cosa, ma la spedizione va da negozio a cliente. Per capire dove debba andare la spedizione, controllo le due checkbox: se la prima è su 1 e la seconda su 0, allora va spedito al cliente.

    Sono due, perché in caso di necessità possiamo bloccare le spedizioni automatiche agendo sulle checkbox.

    Gli altri campi contengono informazioni che sono poi passate al cliente. Qui uno screen dello scenario solo per riferimento:
    2022-02-11_10-13-52.jpeg

    Per rispondere alle tue proposte:

    1. I campi di ACF non sono disponibili tramite API fintanto che l'ordine non viene aggiornato manualmente (o così sembra)
    2. È la soluzione che ho trovato. Il primo modulo di WC imposta i valori di default e il secondo recupera l'ordine. I primi filtri sono sullo stato ordine e sul contenuto dell'ordine, quindi non ci sono problemi di falsi positivi sulle spedizioni.

    shazarak 1 Risposta
  • User Attivo

    @g-lanzi figo!

    alura domanda/proposta: ma invece di gestire le checkbox, non fai prima a creare due nuovi valori per lo status "ricevi pacco" e "invia pacco" ( licenza poetica), cosi su integromat metti il trigger su quei due stati e gestisci il tutto?

    detto cio mentre scrivo mi viene in mente che poi cosi potresti non poter bloccare l'automatismo, e in questo caso allora ti basterebbe un solo checkbox?
    o meglio ancora invece che usare ACF usi un campo meta di woocomerce?


    g.lanzi 1 Risposta
  • Moderatore

    @shazarak

    • Gli status sono impostati per fare diverse cose, tra cui le spedizioni e la comunicazione con il cliente. Se dovessi far impostare manualmente lo stato su "da ritirare", o simili, si perderebbe il vantaggio di farlo in autonomia. Non posso far scattare in autonomia lo stato per via dei vari metodi di pagamento che comprendono anche bonifico e contrassegno. Insomma, aggiungere altri stati complica il lavoro di gestione dell'ordine, quindi cerco di evitare. La proposta è tuttavia valida, solo difficilmente applicabile in questo caso.
    • Usare un solo checkbox complica le cose per gli ordini che sono già in lavorazione, o in caso di override manuale del processo per un motivo qualunque.
    • Ho usato ACF per comodità, ma in effetti usare i metadati di WooCommerce è un'alternativa che testerò. Per ora ho intrapreso questa strada e voglio farla funzionare. Successivamente la posso migliorare.

    shazarak 1 Risposta
  • User Attivo

    @g-lanzi ok, lasciamo perdere l'ipotesi status aggiuntivo,
    pero non capisco, scusa, ma la cosa mi incuriosisce assai, dici che deve essere un automatismo, ma se hai messo delle checkbox sull'ordine, per forza qualcuno dovrà cliccarci sopra no?

    oppure stai dicendo che è integromat aggiorna o meno questi checkbox in automatico?

    e poi ancora quando dici che nel caso volete interrompere la spedizione automatica, vuol dire che qualcuno dovrà cliccare su uno di questi due checkbox nell'ordine corretto? quindi Comunque sia c'è una parte "manuale"?


    g.lanzi 1 Risposta
  • Moderatore

    @shazarak
    in caso di ordine standard, Integromat gestisce i flag. L'operatore deve solo cambiare gli status e accertarsi di ricevere la mail con l'etichetta e i dati (per sicurezza).

    Se, per un motivo qualunque, il processo deve essere interrotto, i flag fanno in modo che le spedizioni non scattano per sbaglio (che vorrebbe dire perdere dei soldi). In questo caso si, vanno operati manualmente, ma sono casi eccezionali.

    Prima, la gestione delle spedizioni era gestita da un tecnico apposito. Ora questa persona può concentrarsi sul prodotto.
    Considera che ogni ordine ha un codice a barre, per chi gestisce una certa fase di lavorazione, basta sparare il codice e impostare lo stato corretto. Il resto viene fatto automaticamente.

    Prossimi miglioramenti saranno introdurre una "chiamata di cortesia" una volta che il servizio è pronto e implementare lo stesso sistema di gestione spedizioni per i prodotti classici che vanno spediti al cliente, che comunque sono una minima parte di quelli venduti.


    shazarak 1 Risposta
  • User Attivo

    @g-lanzi alora

    quando crei un ordine manuale o meno, in database ti va dentro a wp_woocommerce_order_items
    e recuperi ID da order_id

    se compili il checkbox acf creato dentro all'ordine singolo, viene memorizzato qui: wp_postmeta

    dove hai:
    meta_id
    post_id -> il numero ID ordine
    meta_key
    meta_value

    quindi su integromat, quando usi il modulo che recupera i dati dell'ordine, suppongo gli fai poi andare a prendere anche quel dato li ( adesso me lo installo e lo provo che sono curioso)

    come hai detto tu se non checchi manualmente da ordine, il postmeta non viene creato quindi o metti codice in woocommerce che ti popola il default del cehckbox quando crea l'ordine
    oppure dice a integromat di popolare quel checkbox ( preferirei la prima opzione)


    g.lanzi 1 Risposta
  • Moderatore

    @shazarak ha detto in WooCommerce API: ordine senza alcuni metadati:

    come hai detto tu se non checchi manualmente da ordine, il postmeta non viene creato quindi o metti codice in woocommerce che ti popola il default del cehckbox quando crea l'ordine

    Sarebbe la soluzione ideale. Ho provato a farlo con update_field() (suggerito da ACF) su woocommerce_thankyou, ma non sembra funzionare.

    Come mi suggerisci di fare?

    P.S.
    la soluzione di prima non è applicabile perché resetta i valori ad ogni iterazione! Non ci avevo pensato...


    shazarak 1 Risposta