Filtro hook prima della creazione dell'ordine in WooCommerce

19 lug 2017, 20:11:41
Visualizzazioni: 22K
Voti: 7

Vorrei scrivere uno script che esegua un controllo ogni volta che viene creato un ordine in WooCommerce (subito dopo il checkout) e poi modifichi in modo condizionale l'indirizzo di spedizione del cliente.

Penso di aver bisogno di un filtro hook che si "attivi" non appena viene creato un ordine. Ho provato diverse soluzioni nella guida di riferimento degli Hook di WooCommerce, come: 'woocommerce_create_order', ma senza successo. Ho anche contattato il supporto di WooCommerce, ma non ho ottenuto una soluzione. Ho controllato anche: Hook WooCommerce dopo l'ordine (su Stackexchange), tuttavia avrei bisogno di un filtro hook che si attivi prima della creazione dell'ordine (non dopo).

Quello che vorrei realizzare è qualcosa del genere:

function alter_shipping ($order) {
  if ($something == $condition) {
    $order->shipping_address = "..."; // (semplificato)
  }
  return $order;
}
add_filter( 'woocommerce_create_order', 'alter_shipping', 10, 1 );

Questo filtro 'woocommerce_create_order' nell'esempio sopra non passa alcuna variabile da manipolare.

Ho bisogno di manipolare in modo condizionale l'indirizzo di spedizione in un ordine WooCommerce durante la sua creazione. Qualcuno conosce un filtro hook adatto per questo? O un altro modo?

0
Tutte le risposte alla domanda 3
0

Mi sono imbattuto in questo cercando la stessa cosa che ora ho risolto (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'       => 'London',
      'state'      => '',
      'postcode'   => '12345',
      'country'    => 'UK'
    );

    $order->set_address( $address, 'shipping' );

  }

  return $order;

}
27 lug 2018 14:18:28
0

Hai impostato il filtro correttamente ma gli argomenti sono invertiti:

documentazione woocommerce 3.0.6

// definisci la callback woocommerce_create_order
function filter_woocommerce_create_order( $null, $instance ) { 
    // fai avvenire la magia del filtro qui... 
    return $null; 
}; 

// aggiungi il filtro 
add_filter( 'woocommerce_create_order', 'filter_woocommerce_create_order', 10, 2 ); 

Quindi il tuo $order sarebbe sempre null, devi mettere il null al posto del tuo $order, e far passare $order come secondo parametro. Inoltre il valore di ritorno deve essere $order_id altrimenti la funzione try-catch bloccherà il tuo snippet. Ecco la documentazione completa di questa funzione.

versione corretta

function alter_shipping (null,$order) {
  if ($something == $condition) {
    $order->shipping_address = "..."; //(semplificato)
  }
  $order_id = $order->save();

  return $order_id;
}
add_filter( 'woocommerce_create_order', 'alter_shipping', 10, 2);
20 ago 2019 17:22:56
0

Prova l'hook di azione woocommerce_checkout_create_order, viene chiamato appena prima del salvataggio nel database.

woocommerce_checkout_create_order

27 lug 2018 14:25:14