Evitar que el estado del pedido de WooCommerce cambie de / a estados específicos

3 minutos de lectura

Validacion de agregar al carrito de WooCommerce evitar agregar al
Eyal Avitán

Hola, estoy tratando de crear una función en los complementos mu para evitar que ciertos usuarios cambien el estado del pedido de estados de pedido específicos a estados de pedido específicos.

He estado buscando por todas partes y he intentado de muchas maneras diferentes, pero nada parece funcionar.

En realidad, la función se está ejecutando usando woocommerce_order_status_changed gancho de acción Lo que pasa es que este enlace se ejecuta después de que el estado del pedido ya se haya cambiado, lo que está causando un bucle infinito.

El gancho más útil que encontré parece ser woocommerce_before_order_object_save.

encontré “Agregue un argumento adicional para evitar que se llame a ‘woocommerce_order_status_changed'” hilo relacionado útil en WooCommerce Github.
Traté de usar @kloon solución de fragmento de código:

add_filter( 'woocommerce_before_order_object_save', 'prevent_order_status_change', 10, 2 );
function prevent_order_status_change( $order, $data_store ) {
    $changes = $order->get_changes();
    if ( isset( $changes['status'] ) ) {
        $data = $order->get_data();
        $from_status = $data['status'];
        $to_status = $changes['status'];

        // Do your logic here and update statuses with CRUD eg $order->set_status( 'completed' );
                // Be sure to return the order object

    }
    return $order;
}

pero $changes variable es siempre una matriz vacía.

traté de usar wp_insert_post_data gancho de wordpresspero cuando configuro:

$data['post_status'] = "some status";

simplemente evita que se guarde toda la actualización (todos los datos nuevos).

Este es el código que me gustaría ejecutar es:

function($data){
   if($data['order_status'] == 'comlpeted' && $data['new_order_status'] == 'proccessing'){
      // prevent the order status from being changed
      $data['new_order_status'] = $data['order_status'];
   }

  few more if conditions... 

   return $data;
}

Cualquier ayuda o consejo es apreciado.

  • Pregunta ¿Cómo “ciertos usuarios para cambiar el estado del pedido de estados de pedido específicos a estados de pedido específicos”? Por qué “en los mu-complementos” | (Qué significa eso)?

    – LoicTheAztec

    4 de marzo de 2021 a las 10:27

Evitar que el estado del pedido de WooCommerce cambie de
LoicTheAztec

Residencia en @kloon fragmento de código, he podido obtener el estado del pedido anterior y el estado del pedido nuevo. Entonces puedo deshabilitar cualquier cambio de estado de un estado de pedido definido específico a un estado de pedido definido específico.

Con el siguiente código, roles de usuario definidos específicos no se puede cambiar el estado del pedido de “Procesando“a” en-sostener“:

add_filter( 'woocommerce_before_order_object_save', 'prevent_order_status_change', 10, 2 );
function prevent_order_status_change( $order, $data_store ) {
    // Below define the disallowed user roles
    $disallowed_user_roles = array( 'shop_manager');

    $changes = $order->get_changes();

    if( ! empty($changes) && isset($changes['status']) ) {
        $old_status    = str_replace( 'wc-', '', get_post_status($order->get_id()) );
        $new_status    = $changes['status'];
        $user          = wp_get_current_user();
        $matched_roles = array_intersect($user->roles, $disallowed_user_roles);

        // Avoid status change from "processing" to "on-hold"
        if ( 'processing' === $old_status && 'on-hold' === $new_status && ! empty($matched_roles) ) {
            throw new Exception( sprintf( __("You are not allowed to change order from %s to %s.", "woocommerce" ), $old_status, $new_status ) );
            return false;
        }
    }
    return $order;
}

El código va en el archivo functions.php del tema secundario activo (o tema activo). Probado y funciona.

  • ¡Gracias, funciona increíble! fue tanto tiempo en esa cosa

    –Eyal Avitan

    7 de marzo de 2021 a las 7:45


¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad