¿El hook woocommerce_order_status_changed se activa cuando WooCommerce actualiza el estado de un pedido automáticamente?
Tenemos un plugin que utiliza el hook woocommerce_payment_complete
que calcula el valor de puntos de un pedido para nuestros clientes basado en los artículos y el total del pedido. Esto genera un archivo CSV y luego usa rsync
para enviar el archivo CSV a un sistema externo que almacena y manipula estos datos.
En el mismo plugin también usamos el hook woocommerce_order_status_changed
que recalcula los valores dependiendo del nuevo estado del pedido (artículos reembolsados, etc.), genera el archivo CSV y lo envía nuevamente a la fuente externa.
Todo esto funciona bien, un cliente puede realizar un pedido y el archivo CSV se genera, etc., podemos actualizar el estado del pedido manualmente en el panel de administración y el nuevo archivo CSV se genera y envía. Sin embargo, si un pedido se cambia automáticamente a través de WooCommerce o la pasarela de pago, parece que el hook woocommerce_order_status_changed
no se está activando ya que el archivo CSV no se está generando.
Entonces mis preguntas son:
¿El hook
woocommerce_order_status_changed
se activa cuando el estado del pedido cambia automáticamente, o solo cuando nosotros cambiamos el estado del pedido manualmente en el backend?¿Existe algún hook que se active cuando el estado del pedido cambia automáticamente a través de WooCommerce/pasarelas de pago?
He buscado por todas partes pero cada resultado parece apuntar a lo que ya estoy haciendo o trata sobre configurar un script que cambia el estado usando $order->update_status()
y alternativas similares, que no es lo que estamos buscando.
Uno de los resultados mencionó esto (en referencia a woocommerce_order_status_changed
):
"Dónde se usa el hook (en el núcleo de WC): No se usa."
Lo cual parece responder a la Pregunta 1, lo que me lleva a creer que si WooCommerce o una pasarela de pago cambia el estado del pedido automáticamente, nunca se activará, por lo tanto no creará nuestro CSV, etc.
¿Alguien puede arrojar luz sobre esto? ¿Existe algún hook que podamos activar en los cambios de estado de pedidos realizados automáticamente a través de WooCommerce o una pasarela de pago?

Uno de los resultados mostró esto (en referencia a
woocommerce_order_status_changed
):"Dónde se usa el hook (en el núcleo de WC): No se usa."
Lo que parece responder la Pregunta 1, lo que me lleva a creer que si WooCommerce o una pasarela de pago cambia el estado del pedido automáticamente, nunca se disparará, por lo tanto no creará nuestro CSV, etc.
Eso no es lo que significa. Lo que dice es que WooCommerce en sí no añade acciones adicionales a ese hook. No que no se dispare en absoluto.
El hook woocommerce_order_status_changed
se dispara cada vez que se cambia el estado de un pedido usando los métodos $order->update_status()
o $order->set_status()
. WooCommerce solo usa estos métodos internamente para cambiar estados de pedidos (y las extensiones de terceros deberían hacer lo mismo). Así que si WooCommerce mismo actualiza el estado del pedido, automáticamente o no, el hook se disparará. Esto incluye cuando se actualiza el pedido manualmente en el backend.
El hook no se dispararía si una extensión, como una pasarela de pago, intentara establecer el estado del pedido incorrectamente. Por ejemplo, si cambiaran el estado usando $order->status = 'processing'
o wp_transition_post_status( 'on-hold', 'processing', $order );
entonces el hook no se dispararía.
Así que necesitas averiguar en qué circunstancias exactamente no se está disparando el hook. Si es una pasarela de pago actualizando el estado del pedido, y el hook no se dispara, entonces es probable que sus desarrolladores estén haciendo el cambio de estado incorrectamente. En ese punto necesitarías hablar con sus desarrolladores.

Ah vale, ¡eso es útil, gracias! Dos ejemplos entonces: Un pedido usó la pasarela de PayPal. Nota del pedido: "Pedido no pagado cancelado – se alcanzó el límite de tiempo. Estado del pedido cambiado de Pendiente de pago a Cancelado." ¿Entonces esto podría determinarse basándose en cómo PayPal cambia ese estado? El otro usaba la pasarela de Stripe. Nota del pedido #1: "La tarjeta fue rechazada." Nota del pedido #2: "Estado del pedido cambiado de Pendiente de pago a Fallido." ¿Entonces recomendarías contactar con su soporte para ver cómo manejan los cambios de estado del pedido? ¡Gracias de nuevo!

Probablemente ahí es donde yo comenzaría, sí. Me sorprendería que esas dos pasarelas lo estuvieran haciendo incorrectamente, ya que creo que esas integraciones son desarrolladas por o en estrecha colaboración con el equipo de WooCommerce. El problema podría estar simplemente en tu propio código, si no está usando el hook correctamente de alguna manera.

Sí, supongo, solo parece extraño que las acciones/hooks funcionen cuando se hacen manualmente pero no automáticamente, seguramente si un cambio lo dispara el otro también lo haría. Como dijiste, a menos que estén usando wp_transition_post_status
o algo que lo evitaría.

En cuanto a si lo tengo configurado correctamente... el plugin es una clase, el constructor tiene las acciones/hooks que enlazan al mismo método y la clase se instancia en la misma página justo después de su declaración. Lo único que se me ocurre es que el plugin/clase no esté cargado con el script que usa la pasarela para actualizar el estado, lo que tampoco tendría sentido porque supongo que el plugin estaría incluido mientras se carga WordPress.
