Filtro hook antes de crear un pedido en WooCommerce

19 jul 2017, 20:11:41
Vistas: 22K
Votos: 7

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?

0
Todas las respuestas a la pregunta 3
0

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;

}
27 jul 2018 14:18:28
0

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

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

woocommerce_checkout_create_order

27 jul 2018 14:25:14