Filtru hook înainte de crearea comenzii în WooCommerce

19 iul. 2017, 20:11:41
Vizualizări: 22K
Voturi: 7

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ă?

0
Toate răspunsurile la întrebare 3
0

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;

}
27 iul. 2018 14:18:28
0

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);
20 aug. 2019 17:22:56
0

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

woocommerce_checkout_create_order

27 iul. 2018 14:25:14