- Home
- Categorie
- Coding e Sistemistica
- WordPress
- WooCommerce API: ordine senza alcuni metadati
-
@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:
- 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 - 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?
1 Risposta - 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)
-
@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 statoprocessing
. 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 è su1
e la seconda su0
, 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:
Per rispondere alle tue proposte:
- I campi di ACF non sono disponibili tramite API fintanto che l'ordine non viene aggiornato manualmente (o così sembra)
- È 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.
1 Risposta -
@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?
1 Risposta -
- 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.
1 Risposta -
@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"?
1 Risposta -
@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.
1 Risposta -
@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_idse 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_valuequindi 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)
1 Risposta -
@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) suwoocommerce_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...
1 Risposta -
@g-lanzi sto giocando su integromat ora
ti descrivo come ho impostato la cosa poi vedi se ti serve o meno ( per ora con un checkbox solo)
- ACF campo Checkbox su Ordine(backend)
- quando il cliente invia la richiesta di ordine, woocommerce salva i dati negli ordini, ma nulla nel campo ACF
- integromat è in attesa di "order created" (new event) e spara il fllusso
- integromat modulo Get Order ( prende ID dal new event)
- integromat modulo Update order -> dovrebbe aggiungere il default al campo ACF ( qui non so ancora come farlo)
alternativa: integromat Update order aggiunte un meta dato con key e value ( che poi nel caso va mostrato in backend ma è un altro problema) - integromat get order -> a qeusto punto ti vede il campo meta appena agiornato e puoi procedere con il flusso
pero a mio avviso è troppo complicato fatto cosi, e per di piu con il campo ACF suppongo dovresti collegare integromat con le api anche di wordpress per andare ad aggiornare il postmeta ?!?? boh
al momento secondo me la figata sarebbe che in caso di creazione ordine su woocommerce, aggiungi 2 campi per lo Shipping, cosi quando recuperi l'ordine su Integromat dovresti vederli e poterli aggiornare!
provo a vedere come trovare soluzione con ACF e poi mi butto sulla prova campi shipping
1 Risposta -
@shazarak
Con i campi shipping io non sono riuscito ad avere dei checkbox, ma vengono passati subito, in effetti.Grazie per il supporto, comunque! Apprezzo molto!
1 Risposta -
@g-lanzi alora, in linea teorica, il campo ACF lo usi ugualmente per il il backend ordine quando devi cambiarlo manualmente, e su update order gli dici che deve prendere quel campo acf e salvarlo dentro al metafield shipping che hai aggiunto nell'ordine
piu o meno...
edit: meglio ancora non usi piu ACF, e ti crei il checkbox direttamente col metafield del shipping, ma non so se si puo fare ne come fare hhih
1 Risposta -
@shazarak
Guarda, per il momento ho risolto così:
Il modulo evidenziato nell'immagine aggiunge i valori di default solo in caso che i campi siano assenti (ossia se l'ordine è stato appena creato).
Il modulo scatta per primo e dopo aver passato i filtri. Successivamente le cose procedono come prima.
-
SOLVED (apparently)
Probabilmente nei test precedenti sbagliavo qualcosa, ma ripensando a come salvare i campi subito dopo la creazione ordine, ho ritentato la strada dell'hook
woocommerce_thankyou
. A quanto pare funziona, come avrebbe dovuto fin dall'inizio. Ecco come ho risolto, aggiornando i campi automaticamente alla creazione dell'ordine:add_filter('woocommerce_thankyou', 'aggiorna_campi_acf'); function aggiorna_campi_acf( $order_id ){ update_field('ritiro_prenotato', '0', $order_id); update_field('spedizione_prenotata', '0', $order_id); update_field('url_tracciamento', 'foo', $order_id); update_field('data_prevista_ritiro', 'foo', $order_id); update_field('codice_tracciamento', '0', $order_id); }
Avevo già testato questa strada, ma probabilmente ero un attimo invornito e avevo fatto qualche errore nel codice.
Grazie per il supporto @overclokk e @shazarak! Anche solo parlare del problema è servito moltissimo a inquadrarlo meglio!
Il lato negativo del lavorare da casa da soli è la mancanza di confronto con i colleghi!
-
@g-lanzi ha detto in WooCommerce API: ordine senza alcuni metadati:
@overclokk
No, non ho una versione in locale, sto recuperando i dati dagli ordini in arrivo e all'occorrenza faccio un ordine.Devi avere una versione in locale in sviluppo, sempre, ti velocizza il lavoro prima di tutto e ti permette di sperimentare senza buttare giù il server, lavorare su un sito su server remoto non è ottimale, un conto è se devi modificare opzioni da pannelli vari, un altro è quando devi mettere mano al codice, con la seconda se io non ho accesso per scaricare sulla mia macchina il sito non prendo neanche il lavoro.
Poi chi ti assicura che effettuato l'ordine si arrivi sempre alla thank you page? Ovvero che l'evento
woocommerce_thankyou
venga sempre eseguito (scatenato)? Non ne hai la certezza al 100% e quindi in quelle poche volte che l'evento non viene eseguito non ci sarà nessun update e i fields saranno vuoti, per questo dicevo che devi sempre avere un valore di default e lanciare una eccezione in caso qualcosa vada storto, poi prendi l'eccezione e la trasformi in una risposta nella quale inserirai il messaggio di cosa sia successo, questo ti permette di vedere il messaggio json della risposta e risalire al problema.Poi altra cosa, chi ti assicura che
$order_id
sia realmente un order_id? Nessuno, quindi devi validare questo valore, sempre, specialmente quando devi salvare roba sul db, ovvero devi essere sicuro che quel valore sia corretto, idem per gli altri valori vale lo stesso discorso, nel tuo caso sono hardcodati e potresti anche non validare ma in tutti gli altri casi si valida.
1 Risposta -
@overclokk ha detto in WooCommerce API: ordine senza alcuni metadati:
Poi chi ti assicura che effettuato l'ordine si arrivi sempre alla thank you page? Ovvero che l'evento
woocommerce_thankyou
venga sempre eseguito (scatenato)? Non ne hai la certezza al 100% e quindi in quelle poche volte che l'evento non viene eseguito non ci sarà nessun update e i fields saranno vuoti,Cosa potrebbe impedire che
woocommerce_thankyou
sia triggerato? Un errore? Per questo ho un controllo sull'algoritmo che verifica se i campi ci siano e che siano popolati con i valori di default. Se non lo sono, ci pensa lui stesso.per questo dicevo che devi sempre avere un valore di default e lanciare una eccezione in caso qualcosa vada storto, poi prendi l'eccezione e la trasformi in una risposta nella quale inserirai il messaggio di cosa sia successo, questo ti permette di vedere il messaggio json della risposta e risalire al problema.
I valori di default ci sono. Aggiornarli mi serve solo per averli presenti nelle API. Se non li aggiorno e richiamo l'ordine via API, i campi ACF non ci sono.
@overclokk ha detto in WooCommerce API: ordine senza alcuni metadati:
Poi altra cosa, chi ti assicura che $order_id sia realmente un order_id? Nessuno, quindi devi validare questo valore, sempre, specialmente quando devi salvare roba sul db, ovvero devi essere sicuro che quel valore sia corretto, idem per gli altri valori vale lo stesso discorso, nel tuo caso sono hardcodati e potresti anche non validare ma in tutti gli altri casi si valida.
Mi puoi fare un esempio di validazione nel caso che ho scritto sopra? Sono ignorante in materia e imparo volentieri qualcosa si nuovo.
1 Risposta -
@g-lanzi ha detto in WooCommerce API: ordine senza alcuni metadati:
Cosa potrebbe impedire che woocommerce_thankyou sia triggerato? Un errore? Per questo ho un controllo sull'algoritmo che verifica se i campi ci siano e che siano popolati con i valori di default. Se non lo sono, ci pensa lui stesso.
Non lo so, metti che venga persa la connessione proprio nel momento di redirect, metti che il sito vada down, metti che crashi il browser e così via, quando ci sono più di uno step non farei affidamento al successo dello step successivo.
@g-lanzi ha detto in WooCommerce API: ordine senza alcuni metadati:
I valori di default ci sono. Aggiornarli mi serve solo per averli presenti nelle API. Se non li aggiorno e richiamo l'ordine via API, i campi ACF non ci sono.
Non ci sono se no non avresti bisogno di aggiornarli.
@g-lanzi ha detto in WooCommerce API: ordine senza alcuni metadati:
Mi puoi fare un esempio di validazione nel caso che ho scritto sopra? Sono ignorante in materia e imparo volentieri qualcosa si nuovo.
Dipende da cosa vuoi che sia order_id, se vuoi che sia un integer allora verifichi che sia tale, poi considera che WP in generale ti può passare la qualunque, in id, un post, un \WP_Error, null, unicorni ecc.
In quel contesto devi vedere cosa indica la documentazione di WC e ACF, ovvero cosa realmente ti passa WC e cosa realmente vuole ACF come valore, immagino o un post o un post_id almeno, quindi almeno un check su questi che farai all'inizio, se i valori ritornati non sono corretti ritorni subito e fai in modo di segnalartelo nella risposta json o in un log file o dove preferisci.
Ad ogni modo bisogna vedere a monte perché vengono passati campi vuoti.
2 Risposte -
@overclokk scusami domanda, come si fa a lavorare in locale con Integromat? nel senso che se provo ad usare il modulo Woocommerce per creare la connessione con api key e secret, mi chiede l'url del sito e se gli do il localhost e simili questo ovviamente non si collega e non mi fa procedere
1 Risposta -
@shazarak Ma infatti in locale non devi lavorare con servizi esterni, mai, (anche se possibile), tu devi creare un test che verifichi che la risposta che esce dal sito sia quella giusta, per questo parlo di unit test.
Purtroppo nel mondo WP gli unit test non sono conosciuti abbastanza, se ti sposti su altri framework (qualsiasi) e chiedi cosa sia uno unit test ti rispondono subito.
1 Risposta -
Prima o poi mi ci metterò e farò video su questi concetti.
-
@overclokk ahhhhhh ! capito ottimo grazie
edit: forse qualcosa di simile, l'altro giorno ho usato https://www.postman.com/ con la app Postman Agent che mi collega il localhost al web , pero devo studiare meglio tutto il discorso