• Buenas tardes,

    Estoy modificando un WooCommerce para ajustarlo a las necesidades del cliente y me encuentro en un camino sin salida. El escenario es el siguiente:

    Un cliente compra un producto y cuando lo recibe en casa debe buscar el código único que tiene ese producto concreto (son tests, por lo que hay que identificarlos de forma única). Luego va a /mis-pedidos/ en la web e introduce dicho código en el item de su producto (he creado un formulario para tal efecto en cada línea del pedido) y el sistema lo añade como itemmeta wc_add_order_item_meta( $item_id, $key, $value, false ); Es ahí donde no encuentro solución, porque si compra dos productos iguales, WooCommerce los mete en una sola línea de pedido (marcada con un bonito ‘x2’). Necesito identificar cada producto por separado, aunque sean el mismo.

    Si le añado los productos desde el backend de uno en uno, cada item ocupa una línea del pedido y puedo asignarles a cada uno su código único.

    ¿Hay alguna forma de «separar» cada producto comprado en un item por línea? Gracias por adelantado.

    Este es el código para recorrer los pedidos del usuario y dentro de cada pedido, las líneas del mismo:

    <?php 
    	$order_items  = $order->get_items();
    	$number_items = count($order_items);
    	$iteracion 	  = 1;
    	$completed 	  = 0;
    
            foreach( $order_items as $item_id => $item_data ) :
            	// if (! isset( $_POST['name_of_nonce_field'] ) || ! wp_verify_nonce( $_POST['name_of_nonce_field'], 'name_of_my_action' ) ) {
    
    	        	// Update order with postmeta 
    				if ( isset($_POST['code1'.$iteracion]) ) {
    					if ( $_POST['code1'.$iteracion] === $_POST['code2'.$iteracion] ) {
    						// Add barcode
    						wc_add_order_item_meta($item_id, '_order_barcode', $_POST['code1'.$iteracion], false);
    						// Add checkbox
    						wc_add_order_item_meta($item_id, '_preserve_sample', $_POST['preserve_sample'.$iteracion], false);
    						// Add name if exist
    						if ( isset($_POST['name_product'.$iteracion]) ) {
    							wc_add_order_item_meta($item_id, 'name_product', $_POST['name_product'.$iteracion], false);
    						}
    						
    
    						?><p class="alert alert-success">Código correctamente introducido.</p><?php
    					} else {
    						?><p class="alert alert-warning">Los códigos no coinciden. Por favor, revíselos bien.</p><?php
    					}// End if equal
    				}// end if isset
    
            	// }// End if nonce
    			
    			$data_code = $order->get_item_meta($item_id, '_order_barcode', true);
    			$name_code = $order->get_item_meta($item_id, 'name_product', true);
    
    			?>
    			<article class="order-item <?php echo $item_data["name"] . ' ' . $order->get_order_number() . ' ' . $item_id; ?>">
    				<h3>Producto <b style="color:#004F51;"><?php echo $item_data["name"] ?></b> con número <b style="color:#004F51;"><?php echo $order->get_order_number() . '-' . $item_id; ?></b></h3>
    				<?php
    
    				if ( $data_code == '' ) : ?>
    					<div id="barcode_checkout_field" style="text-align: left; padding: 20px 30px;">
    						<form id="js-form-code" action="" method="POST">
    							<p><label for="code1<?php echo $iteracion; ?>">
    								Introduce el código de barras adjunto al kit de recolección de muestras recibido para el producto <a href="<?php echo get_permalink( $item_data["product_id"] ); ?>"><b style="color:#004F51;"><?php echo $item_data["name"] ?></b></a> con número <b style="color:#004F51;"><?php echo $order->get_order_number() . '-' . $item_id; ?></b>.
    							</label><br>
    							<input id="code1<?php echo $iteracion; ?>" name="code1<?php echo $iteracion; ?>" type="number" min="0" max="999999999" value></p>
    							
    							<p><label for="code2<?php echo $iteracion; ?>">
    								Para evitar errores, por favor, vuelva a introducir el código de barras
    							</label><br>
    							<input id="code2<?php echo $iteracion; ?>" name="code2<?php echo $iteracion; ?>" type="number" min="0" max="999999999" value></p>
    							
    							<p><label for="name_product<?php echo $iteracion; ?>">
    								Si lo desea, introduzca un nombre para identificarlo de los demás productos adquiridos. Ej: Muestra de María.
    							</label><br>
    							<input id="name_product<?php echo $iteracion; ?>" name="name_product<?php echo $iteracion; ?>" type="text" placeholder="Muestra de María" value="<?php echo $_POST['name_product']; ?>"></p>
    							
    							<p><label for="name_product<?php echo $iteracion; ?>">
    								¿Desea que conservemos su muestra?
    							</label><br>
    							<input id="preserve_sample<?php echo $iteracion; ?>" name="preserve_sample<?php echo $iteracion; ?>" type="checkbox" <?php echo $retVal = (isset($_POST['_preserve_sample'])) ? 'checked="checked"' : '' ; ?>></p>
    
    							<?php // wp_nonce_field( 'name_of_my_action', 'name_of_nonce_field' ); ?>
    							<p class="text-right"><input class="btn btn-primary" type="submit"></p>
    						</form>
    				    </div>
    				<?php else : ?>
    				<?php $completed++; ?>
    					<div id="barcode_checkout_field">
    						<p>Código introducido para su producto <b style="color:#004F51;"><?php echo $name_code; ?></b></a> : <?php echo $data_code; ?></p>
    					</div>
    					<?php $json_report = $order->get_item_meta($item_id, '_json_report', true); ?>
    					<?php if ($json_report) { ?>
    
    						<form action="<?php echo content_url( '/plugins/report-builder/generate-report.php' ); ?>" method="POST">								
    							<input style="display:none;" type="text" class="form-control" name="customer_name" id="customer_name"    value="<?php echo wp_get_current_user()->user_login; ?>">
    							<input style="display:none;" type="text" class="form-control" name="codebar"       id="codebar"    	 	 value="<?php echo $data_code; ?>">
    							<input style="display:none;" type="text" class="form-control" name="name_code"     id="name_code"    	 value="<?php echo $name_code; ?>">
    							<input style="display:none;" type="text" class="form-control" name="order_id"      id="order_id"    	 value="<?php echo $order_id; ?>">
    							<input style="display:none;" type="text" class="form-control" name="report_id"     id="report_id"   	 value="<?php echo $item_id; ?>">
    							<input style="display:none;" type="text" class="form-control" name="report_name"   id="report_name" 	 value="<?php echo $item_data['name']; ?>">
    							<input style="display:none;" type="text" class="form-control" name="json_report"   id="json_report" 	 value='<?php echo $json_report; ?>'>
    							<input type="submit" class="btn btn-primary" name="generate_report" value="Generar informe" style="margin:0 auto;">
    						</form>
    						<?php } else { ?>
    							<p>Aún no hemos terminado de analizar su muestra.</p>
    						<?php } // end if have json ?>
    				<?php endif; ?>
    
    				<?php $iteracion++;
    	        	
    				if ( $completed === $number_items ) {
    					// Change order status
    					$order->update_status('analyzing-sample', 'El cliente ha introducido todos los códigos del pedido.' ); // order note is optional, if you want to  add a note to order
    				}	?>
    			</article>  
            <?php endforeach;// end foreach ?>
Viendo 1 respuesta (de un total de 1)
  • Iniciador del debate Jose Lazo

    (@jose-lazo)

    Bueno, pues he encontrado la solución. Pongo aquí el código ,muy personalizado para el cliente, pero entendiéndolo se puede ajustar a las necesidades de cada uno:

    /**
     * Add unique id foreach order item
     * @param [type] $order_id [description]
     */
    function add_unique_id($order_id) {
        // Get last _unique_id
        global $wpdb;
        $results = $wpdb->get_results( 
            "SELECT *
            FROM {$wpdb->prefix}woocommerce_order_itemmeta
            WHERE meta_key = 'unique_id'
            ORDER BY meta_id DESC
            LIMIT 1"
            , ARRAY_A  );
        // $results[0]['meta_value'] = GG11111A
    
        $order  = new WC_Order( $order_id );
        $items  = $order->get_items();
        $letter = "A";
        foreach ($items as $item_id => $item_data ) {
            if ( $item_data["name"] != 'Tarjeta regalo') :
                $lastcode               = $results[0]['meta_value'];
                if(!$lastcode)$lastcode = 'GG11110A'; // initialize first $lastcode
                $lastcodenumber         = substr($lastcode, 2, -1); // Delete the "GG" and "A"      = 11110
                $lastcodenumberletter   = substr($lastcode, -1);    // Delete the "GG" and "number" = A
                $longitud               = 5;
    
                if ( $lastcodenumber == 99999) {
                    ++$letter;
                    $lastcodenumber = 11111;
                } else {
                    ++$lastcodenumber;
                }
    
                $gen_code_id = "GG" . $lastcodenumber . $letter; 
                wc_add_order_item_meta($item_id, 'unique_id', $gen_code_id);
            endif;
        }// end foreach
    }
    add_action( 'woocommerce_order_status_processing', 'add_unique_id', 1, 1 ); // Early priority to use unique id in Correos WebService

    Espero que le sirva a alguien

Viendo 1 respuesta (de un total de 1)
  • El debate ‘Una línea por producto’ está cerrado a nuevas respuestas.