Il gancio woocommerce_order_status_changed si attiva quando WooCommerce aggiorna automaticamente lo stato di un ordine?
Abbiamo un plugin che utilizza l'hook woocommerce_payment_complete
che calcola il valore in punti di un ordine per i nostri clienti in base agli articoli e al totale dell'ordine. Questo genera un file CSV e poi usa rsync
per inviare il file CSV a un sistema esterno che memorizza e manipola questi dati.
Nello stesso plugin utilizziamo anche l'hook woocommerce_order_status_changed
che ricalcola i valori in base al nuovo stato dell'ordine (articoli rimborsati ecc), genera il file CSV e lo invia nuovamente alla fonte esterna.
Questo funziona tutto bene, un cliente può effettuare un ordine e il file CSV viene generato ecc, possiamo aggiornare manualmente lo stato dell'ordine nel pannello di amministrazione e il nuovo file CSV viene generato e inviato. Tuttavia, se un ordine viene modificato automaticamente tramite WooCommerce o il gateway di pagamento, sembra che l'hook woocommerce_order_status_changed
non si attivi poiché il file CSV non viene generato.
Quindi le mie domande sono:
L'hook
woocommerce_order_status_changed
viene attivato quando lo stato dell'ordine viene modificato automaticamente, o solo quando lo stato dell'ordine viene modificato manualmente nel backend da noi?Esiste un hook che viene attivato quando lo stato dell'ordine viene modificato automaticamente tramite WooCommerce/gateway di pagamento?
Ho cercato in lungo e in largo ma ogni risultato sembra puntare a ciò che sto già facendo o riguarda la configurazione di uno script che modifica lo stato usando $order->update_status()
e alternative simili che non è ciò che stiamo cercando.
Uno dei risultati ha evidenziato questo (in riferimento a woocommerce_order_status_changed
):
"Dove viene utilizzato l'hook (nel core WC): Non viene utilizzato."
Questo sembra rispondere alla Domanda 1, che è ciò che mi porta a credere che se WooCommerce o un gateway di pagamento modifica automaticamente lo stato dell'ordine, non si attiverà mai, quindi non creerà il nostro CSV ecc.
Qualcuno può fare luce su questo? Esiste un hook che possiamo attivare sugli stati degli ordini modificati automaticamente tramite WooCommerce o un gateway di pagamento?

Uno dei risultati ha evidenziato questo (in riferimento a
woocommerce_order_status_changed
):"Dove viene utilizzato l'hook (nel core di WC): Non utilizzato."
Il che sembra rispondere alla Domanda 1, ed è ciò che mi porta a credere che se WooCommerce o un gateway di pagamento cambia automaticamente lo stato dell'ordine, questo non verrà mai attivato, quindi non creerà il nostro CSV ecc.
Non è questo il significato. Quello che significa è che WooCommerce stesso non aggiunge azioni aggiuntive a questo hook. Non che non venga attivato del tutto.
L'hook woocommerce_order_status_changed
viene attivato ogni volta che lo stato di un ordine viene modificato utilizzando i metodi $order->update_status()
o $order->set_status()
. WooCommerce utilizza questi metodi internamente per cambiare gli stati degli ordini (e le estensioni di terze parti dovrebbero fare altrettanto). Quindi se WooCommerce stesso aggiorna lo stato dell'ordine, automaticamente o meno, l'hook verrà attivato. Questo include anche quando si aggiorna manualmente l'ordine nel pannello di amministrazione.
L'hook non verrebbe attivato se un'estensione, come un gateway di pagamento, provasse a impostare lo stato dell'ordine in modo errato. Ad esempio, se cambiassero lo stato utilizzando $order->status = 'processing'
o wp_transition_post_status( 'on-hold', 'processing', $order );
allora l'hook non verrebbe attivato.
Quindi dovrai scoprire in quali circostanze esatte l'hook non viene attivato. Se è un gateway di pagamento che aggiorna lo stato dell'ordine e l'hook non viene attivato, è probabile che i suoi sviluppatori stiano effettuando il cambio di stato in modo errato. A quel punto dovrai contattare i suoi sviluppatori.

Ah ok, questo è utile, grazie! Allora due esempi: Un ordine ha utilizzato il gateway PayPal. Nota ordine: "Ordine non pagato cancellato - limite di tempo raggiunto. Stato ordine cambiato da In attesa di pagamento a Cancellato." Quindi questo potrebbe essere determinato in base a come PayPal cambia quello stato? L'altro utilizzava il gateway Stripe. Nota ordine #1: "La carta è stata rifiutata." Nota ordine #2: "Stato ordine cambiato da In attesa di pagamento a Fallito." Quindi consiglieresti di contattare il loro supporto per vedere come gestiscono i cambiamenti di stato degli ordini? Grazie ancora!

Probabilmente è da qui che inizierei, sì. Sarei sorpreso se quei due gateway lo stessero facendo in modo errato, dato che credo che quelle integrazioni siano sviluppate da o in stretta collaborazione con il team di WooCommerce. Il problema potrebbe essere solo nel tuo codice, se in qualche modo non sta utilizzando correttamente l'hook.

Sì immagino, sembra solo strano che le azioni/hook funzionino quando fatte manualmente ma non automaticamente, sicuramente se un cambiamento le attiva l'altro dovrebbe farlo altrettanto? Come hai detto, a meno che non stiano usando wp_transition_post_status
o qualcosa di simile che lo eviterebbe.

Per quanto riguarda se ho configurato tutto correttamente... il plugin è una classe, il costruttore ha le azioni/hook che puntano entrambi allo stesso metodo e la classe viene istanziata nella stessa pagina direttamente dopo la sua dichiarazione. L'unica cosa a cui posso pensare è che il plugin/classe non venga caricato con lo script che il gateway utilizza per aggiornare lo stato, il che non avrebbe senso dato che presumibilmente il plugin dovrebbe essere incluso quando WordPress viene caricato.
