Filtro hook prima della creazione dell'ordine in WooCommerce
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?

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;
}

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);

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