Filtro hook antes de crear un pedido en WooCommerce
Me gustaría escribir un pequeño script que realice una comprobación cada vez que se crea un pedido en WooCommerce (justo después del checkout) y que luego modifique condicionalmente la Dirección de Envío del cliente.
Creo que necesito un hook de filtro que se 'dispare' tan pronto como se cree un pedido. He probado varias cosas en la guía de referencia de Hooks de WooCommerce, como: 'woocommerce_create_order', pero sin éxito. También contacté con el soporte de WooCommerce, pero no obtuve solución. También revisé: Hook de Woocommerce después del pedido (en Stackexchange), sin embargo, necesitaría un hook de filtro que se dispare antes de crear el pedido (no después).
Lo que me gustaría lograr es algo como:
function alter_shipping ($order) {
// Si algo es igual a una condición
if ($something == $condition) {
$order->shipping_address = "..."; //(simplificado)
}
return $order;
}
add_filter( 'woocommerce_create_order', 'alter_shipping', 10, 1 );
Este filtro 'woocommerce_create_order' en el ejemplo anterior no pasa ninguna variable que pueda ser manipulada.
Necesito manipular condicionalmente la dirección de envío en un pedido de WooCommerce mientras se está creando. ¿Alguien conoce un hook de filtro adecuado para esto? ¿O alguna otra manera?

Me topé con esto mientras buscaba lo mismo, lo cual ahora he resuelto (Woocommerce 3.x)...
add_filter( 'woocommerce_checkout_create_order', 'mbm_alter_shipping', 10, 1 );
function mbm_alter_shipping ($order) {
if ($algo == $condicion) {
$direccion = 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' => 'Londres',
'state' => '',
'postcode' => '12345',
'country' => 'Reino Unido'
);
$order->set_address( $direccion, 'shipping' );
}
return $order;
}

Tienes el filtro correcto pero los argumentos están mal colocados:
Documentación de WooCommerce 3.0.6
// Definir el callback para woocommerce_create_order
function filter_woocommerce_create_order( $null, $instance ) {
// Realizar la magia del filtro aquí...
return $null;
};
// Añadir el filtro
add_filter( 'woocommerce_create_order', 'filter_woocommerce_create_order', 10, 2 );
Por lo tanto, tu parámetro $order
siempre sería nulo, luego reemplaza el valor nulo por tu $order
, y deja que $order
se mueva al segundo parámetro. El valor de retorno debe ser $order_id
o la función try-catch bloqueará tus fragmentos de código. Aquí está la documentación completa de esta función.
Solución corregida
function alter_shipping (null,$order) {
if ($something == $condition) {
$order->shipping_address = "..."; //(simplificado)
}
$order_id = $order->save();
return $order_id;
}
add_filter( 'woocommerce_create_order', 'alter_shipping', 10, 2);

Prueba el hook de acción woocommerce_checkout_create_order
, se llama justo antes de guardar en la base de datos.
