Genere un número de pedido aleatorio pero impida la regeneración en WooCommerce

1 minuto de lectura

avatar de usuario
usuario567

Estoy tratando de agregar una cadena aleatoria cuando se crea el número de pedido, ya que el número secuencial predeterminado se puede adivinar muy fácilmente.

Probé este fragmento:

function generate_random_string( $length = 16 ) {
    return substr( str_shuffle( str_repeat( $x = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ', ceil( $length / strlen( $x ) ) ) ), 1, $length );
}
    
add_filter( 'woocommerce_order_number', 'ct_change_woocommerce_order_number', 1, 2);

function ct_change_woocommerce_order_number( $order_id, $order ) {
     $random_string1 = generate_random_string(5);
    return $random_string1 . $order->get_id();
}

El problema es que esto cambia el número de pedido cada vez que se solicita el número de pedido en algún lugar.

Esto funcionaría si usara un prefijo y un sufijo constantes, pero en la forma real se muestra un número de pedido diferente cada vez para el mismo pedido. ¿Algún consejo?

avatar de usuario
7uc1f3r

Para evitar esto, puede guardar el resultado como metadatos, una vez que esto exista, devuelva los metadatos en lugar del resultado de la función.

Entonces obtienes:

function generate_random_string( $length = 16 ) {
    return substr( str_shuffle( str_repeat( $x = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ', ceil( $length / strlen( $x ) ) ) ), 1, $length );
}

function filter_woocommerce_order_number( $order_number, $order ) {
    // Get meta
    $random_meta_string = $order->get_meta( '_random_meta_string' );

    // When meta empty
    if ( empty ( $random_meta_string ) ) {
        // Call function
        $generate_random_string = generate_random_string( 5 );

        // Append
        $random_string = $generate_random_string . $order->get_id();

        // Add the meta data
        $order->update_meta_data( '_random_meta_string', $random_string );

        // Return random string
        $order_number = $random_string;
    } else {
        // Return meta
        $order_number = $random_meta_string;
    }
    
    return $order_number;
}
add_filter( 'woocommerce_order_number', 'filter_woocommerce_order_number', 10, 2 );

¿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