Hook-ul woocommerce_order_status_changed se declanșează când WooCommerce actualizează automat statusul comenzii?

15 feb. 2019, 15:17:44
Vizualizări: 21.2K
Voturi: 1

Avem un plugin care folosește hook-ul woocommerce_payment_complete care calculează valoarea în puncte a comenzilor pentru clienții noștri bazată pe produse și totalul comenzii. Acesta generează un fișier CSV și apoi folosește rsync pentru a trimite fișierul CSV către un sistem extern care stochează și manipulează aceste date.

În același plugin folosim și hook-ul woocommerce_order_status_changed care recalculează valorile în funcție de noul status al comenzii (produse returnate etc), generează fișierul CSV și îl trimite din nou către sursa externă.

Totul funcționează bine, un client poate face o comandă și fișierul CSV este generat etc, putem actualiza manual statusul comenzii în panoul de administrare și noul fișier CSV este generat și trimis. Totuși, dacă o comandă este modificată automat prin WooCommerce sau gateway-ul de plată, se pare că hook-ul woocommerce_order_status_changed nu se declanșează deoarece fișierul CSV nu este generat.

Așadar întrebările mele sunt:

  1. Hook-ul woocommerce_order_status_changed este declanșat când statusul comenzii este modificat automat, sau doar când statusul comenzii este modificat manual în backend de către noi?

  2. Există vreun hook care este declanșat când statusul comenzii este modificat automat prin WooCommerce/gateway-uri de plată?

Am căutat îndelung dar fiecare rezultat pare să indice fie ceea ce fac deja, fie este despre configurarea unui script care modifică statusul folosind $order->update_status() și alternative similare care nu sunt ceea ce căutăm.

Unul dintre rezultate a adus în discuție următoarele (referitor la woocommerce_order_status_changed):

"Unde este folosit hook-ul (în nucleul WC): Nu este folosit."

Ceea ce pare să răspundă la Întrebarea 1, fapt ce mă face să cred că dacă WooCommerce sau un gateway de plată modifică automat statusul comenzii, acesta nu se va declanșa niciodată, deci nu va crea CSV-ul nostru etc.

Poate cineva să facă lumină în această privință? Există vreun hook pe care îl putem declanșa la modificările automate ale statusului comenzii prin WooCommerce sau un gateway de plată?

0
Toate răspunsurile la întrebare 1
4

Unul dintre rezultate a adus în discuție acest aspect (referitor la woocommerce_order_status_changed):

"Unde este folosit hook-ul (în WC core): Nu este folosit."

Ceea ce părea să răspundă la Întrebarea 1, lucru care mă face să cred că dacă WooCommerce sau o pasarelă de plată schimbă automat statusul comenzii, acesta nu va fi declanșat, astfel necreând fișierul CSV etc.

Nu asta înseamnă. Mesajul spune că WooCommerce în sine nu adaugă nicio acțiune suplimentară la acest hook. Nu că hook-ul nu este declanșat deloc.

Hook-ul woocommerce_order_status_changed se declanșează ori de câte ori statusul unei comenzi este schimbat folosind metodele $order->update_status() sau $order->set_status(). WooCommerce folosește aceste metode intern pentru a schimba statusul comenzilor (și extensiile terțe ar trebui să facă la fel). Deci dacă WooCommerce însuși actualizează statusul comenzii, automat sau nu, hook-ul va fi declanșat. Acest lucru include și actualizarea manuală a comenzii din panoul de administrare.

Hook-ul nu ar fi declanșat dacă o extensie, cum ar fi o pasarelă de plată, încercă să seteze statusul comenzii incorect. De exemplu, dacă schimbă statusul folosind $order->status = 'processing' sau wp_transition_post_status( 'on-hold', 'processing', $order );, atunci hook-ul nu va fi declanșat.

Deci va trebui să afli în ce circumstanțe exact hook-ul nu se declanșează. Dacă o pasarelă de plată actualizează statusul comenzii, iar hook-ul nu se declanșează, atunci este probabil ca dezvoltatorii ei să schimbe statusul incorect. În acest caz, va trebui să discuți cu dezvoltatorii acesteia.

15 feb. 2019 15:47:45
Comentarii

Ah, înțeleg, asta e util, mulțumesc! Două exemple atunci: O comandă a folosit gateway-ul PayPal. Nota comenzii: "Comandă neplatită anulată – limita de timp atinsă. Statusul comenzii schimbat din În așteptarea plății în Anulată." Deci asta ar putea fi determinat în funcție de cum PayPal schimbă acel status? Cealaltă a folosit gateway-ul Stripe. Nota comenzii #1: "Cardul a fost refuzat." Nota comenzii #2: "Statusul comenzii schimbat din În așteptarea plății în Eșuată." Deci ai recomanda să iau legătura cu suportul lor pentru a vedea cum gestionează schimbările de status al comenzii? Mulțumesc din nou!

no. no.
15 feb. 2019 16:04:08

Probabil aș începe de acolo, da. Aș fi surprins dacă acele două gateway-uri ar face asta incorect, având în vedere că cred că acele integrări sunt dezvoltate de sau în strânsă colaborare cu echipa WooCommerce. Problema ar putea fi doar în codul tău, dacă nu folosește hook-ul cum trebuie.

Jacob Peattie Jacob Peattie
15 feb. 2019 16:06:19

Da, probabil, doar pare ciudat că acțiunile/hook-urile funcționează când sunt făcute manual dar nu automat, logic că dacă o schimbare o declanșează și cealaltă ar face la fel. Cum ai zis, decât dacă ei folosesc wp_transition_post_status sau ceva similar care ar evita asta.

no. no.
15 feb. 2019 16:11:34

În ceea ce privește dacă am configurat corect... plugin-ul este o clasă, constructorul are acțiunile/hook-urile ambele legate la aceeași metodă, iar clasa este instanțiată pe aceeași pagină imediat după declarația ei. Singurul lucru la care mă pot gândi este că plugin-ul/clasa nu este încărcat cu scriptul pe care gateway-ul îl folosește pentru a actualiza statusul, ceea ce de asemenea nu ar avea sens deoarece cu siguranță plugin-ul ar trebui inclus pe măsură ce WordPress este încărcat.

no. no.
15 feb. 2019 16:14:19