Filtru hook înainte de crearea comenzii în WooCommerce
Aș dori să scriu un script care face o verificare de fiecare dată când se creează o comandă în WooCommerce (imediat după finalizarea comenzii) și apoi modifică condițional adresa de livrare a clientului.
Cred că am nevoie de un filtru hook care se declanșează imediat ce este creată o comandă. Am încercat mai multe variante din ghidul de referință pentru hook-uri WooCommerce, cum ar fi: 'woocommerce_create_order', dar fără succes. Am contactat și suportul WooCommerce, dar nu am primit o soluție. Am verificat și: Hook WooCommerce după comandă (pe Stackexchange), cu toate acestea, aș avea nevoie de un filtru hook care se declanșează înainte de crearea comenzii (nu după).
Ceea ce aș dori să realizez este ceva de genul:
function alter_shipping ($order) {
if ($something == $condition) {
$order->shipping_address = "..."; //(simplificat)
}
return $order;
}
add_filter( 'woocommerce_create_order', 'alter_shipping', 10, 1 );
Acest filtru 'woocommerce_create_order' din exemplul de mai sus nu transmite nicio variabilă care să poată fi manipulată.
Am nevoie să manipulez condițional adresa de livrare într-o comandă WooCommerce în momentul în care aceasta este creată. Știe cineva un filtru hook potrivit pentru acest lucru? Sau o altă metodă?

Am dat peste asta în căutarea aceluiași lucru pe care l-am rezolvat acum (WooCommerce 3.x)...
add_filter( 'woocommerce_checkout_create_order', 'mbm_alter_shipping', 10, 1 );
function mbm_alter_shipping ($order) {
if ($something == $condition) {
$address = array(
'first_name' => 'Martin',
'last_name' => 'Stevens',
'company' => 'MBM Studio',
'email' => 'test@test.com',
'phone' => '777-777-777-777',
'address_1' => '99 Arcadia Avenue',
'address_2' => '',
'city' => 'Londra',
'state' => '',
'postcode' => '12345',
'country' => 'UK'
);
$order->set_address( $address, 'shipping' );
}
return $order;
}

ai utilizat filtrul corect, dar argumentele sunt în ordine greșită:
documentația woocommerce 3.0.6
// definim callback-ul woocommerce_create_order
function filter_woocommerce_create_order( $null, $instance ) {
// aici se întâmplă magia filtrului...
return $null;
};
// adăugăm filtrul
add_filter( 'woocommerce_create_order', 'filter_woocommerce_create_order', 10, 2 );
Deci $order
tău va fi întotdeauna null, apoi înlocuiește null-ul cu $order
-ul tău, și lasă $order
să fie al doilea parametru. Valoarea returnată trebuie să fie $order_id
altfel funcția try-catch îți va bloca snippet-urile. Iată documentația completă pentru această funcție.
corectat
function alter_shipping (null,$order) {
if ($something == $condition) {
$order->shipping_address = "..."; //(simplificat)
}
$order_id = $order->save();
return $order_id;
}
add_filter( 'woocommerce_create_order', 'alter_shipping', 10, 2);

Încearcă action hook-ul woocommerce_checkout_create_order
, care este apelat chiar înainte de salvarea în baza de date.
