woocommerce_order_status_changed gancho: ¿obteniendo estado antiguo y nuevo?

3 minutos de lectura

avatar de usuario
marcel

¿Cómo puedo obtener el estado anterior y el estado nuevo de un pedido usando el gancho de WooCommerce? woocommerce_order_status_changed?

Este es mi código, pero sólo el $order_id está lleno..

add_action('woocommerce_order_status_changed','woo_order_status_change_custom');
function woo_order_status_change_custom($order_id,$old_status,$new_status) {
//order ID is filled
//old_status and new_status never
//tested by logging the parameters
}

Ahora puedo obtener fácilmente el nuevo estado usando este código:

 $order = new WC_Order( $order_id );
$orderstatus = $order->status;

Pero, ¿cómo puedo obtener el estado del pedido anterior, ya que $old_status ¿esta vacio?

  • ¡Gracias por la rápida respuesta! Eso solo muestra el estado nuevo, no el estado anterior. Mirando el enlace woocommerce_order_status_changed, esperaría poder usar los parámetros old_status y new_status, pero permanecen vacíos.

    – Marcelo

    7 de septiembre de 2017 a las 7:26

  • Gracias, pero $old_status y $new_status siempre están vacíos..? Solo el $order_id tiene un valor.

    – Marcelo

    7 de septiembre de 2017 a las 8:05

avatar de usuario
usuario1980232

Estaba buscando ganchos para wc y encontré esta publicación. La razón por la que los parámetros no están establecidos es que te faltan argumentos en la función add_action. Esta función tiene por defecto un solo parámetro. Para tener los tres debes usar:

add_action('woocommerce_order_status_changed', 'woo_order_status_change_custom', 10, 3);

los 10 es el orden predeterminado para las acciones en WordPress, y el último argumento es la cantidad de parámetros que WordPress debe pasar a la acción personalizada.

Porque no agregó NÚMERO de parámetros al final de la llamada add_action. Aquí está la línea correcta:

add_action('woocommerce_order_status_changed','woo_order_status_change_custom', 10, 3);

“10, 3” significa “Quiero que se envíen 3 parámetros a mi función de devolución de llamada”. De forma predeterminada, solo se enviará 1 parámetro (order_id).

Prueba este código. Según yo, debería funcionar según sus comentarios.

add_action( 'save_post', 'wpse63478_save' );
function wpse63478_save() {

 if(!current_user_can('manage_options'))
   return false;
 if(!is_admin())
    return false;
 if($_REQUEST['post_type'] != 'shop_order')
    return false;
 if($_REQUEST['post_ID']!='')
 {
    $orderId = $_REQUEST['post_ID'];
    $order = new WC_Order( $orderId );
    $currentStatus = $order->status;
    $requestedStautus = $_REQUEST['order_status'];
    if ( $requestedStautus== 'on-hold' and $currentStatus == 'completed') {
        //Do your work here
    }
 }
}

  • ¡Muchas gracias! Intentaré esto. Pregunta rápida de antemano: el !is_admin(), ¿significa esto que solo funcionará cuando el guardado se ejecute desde el backend de WP? Porque un pedido probablemente obtendrá el estado ‘completado’ durante el pago en la mayoría de los casos. Me pregunto si en ese caso esto pasará la comprobación !is_admin().

    – Marcelo

    7 sep 2017 a las 12:07

  • is_admin significa que este código se ejecuta solo desde el backend, ya que el gancho save_post también se puede llamar desde el front-end. así que por razones de seguridad puse ese código.

    – Akshay Shah

    7 de septiembre de 2017 a las 12:09

  • avíseme si no funciona para usted y si funciona para usted, dé la respuesta correcta y vote a favor para que otros puedan tomar esto como referencia.

    – Akshay Shah

    7 sep 2017 a las 12:10

  • Hola, si quisiera usar esto también en la interfaz (porque cuando un usuario compra un producto virtual y paga directamente al finalizar la compra, el estado del pedido cambiará a completado directamente): en este caso, ¿sería seguro eliminar el user_can? y comprobaciones is_admin(), ya que el usuario actual sería un invitado que realiza el check-out?

    – Marcelo

    8 de septiembre de 2017 a las 13:06

  • sí, elimínelo para que todos los usuarios puedan actualizar la publicación, pero con eso debe enviar la identificación y el posttipo de la publicación en campos ocultos.

    – Akshay Shah

    8 de septiembre de 2017 a las 13:09


¿Ha sido útil esta solución?