Guarde el valor de una fila personalizada agregada después de la tabla de pedidos y muéstrelo en los pedidos y correos electrónicos de WooCommerce

3 minutos de lectura

avatar de usuario
Flavio Pessoa

Este código que escribí muestra información personalizada en la página de pago de WooCommerce.

add_action( 'woocommerce_cart_totals_after_order_total', 'show_total_discount_cart_checkout', 9999 );
add_action( 'woocommerce_review_order_after_order_total', 'show_total_discount_cart_checkout', 9999 );
 
function show_total_discount_cart_checkout() {
    
   $discount_total = 0;
    
    
   foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {     
   $product = $cart_item['data'];
       
   $subtotal = WC()->cart->get_product_subtotal( $product, $cart_item['quantity'] );
        
   $total = WC()->cart->total;
   $pctm = 90.00;
   $valor_descontado = $total - ($total / 100 * $pctm); 
        
   $sale_price="10%"; 
   $discount = ( WC()->cart->total - $valor_descontado );
   $discount_total = $discount;
   
}                
    if ( $discount_total > 0 ) {
      echo '<tr><th>VOCÊ RECEBERÁ DE CASHBACK:</th><td data-title="You">' . wc_price( $discount_total + WC()->cart->get_discount_total() ) .'</td></tr>';
    }
  
} 

El resultado:

ingrese la descripción de la imagen aquí


Necesito que esta información también se muestre en los pedidos y correos electrónicos de WooCommerce. Creo que puedo encontrar una solución para mostrar este valor en varias otras páginas, pero ¿alguien puede decirme primero cómo guardar/almacenar el valor de este cálculo?

En primer lugar, he reescrito su código existente por las siguientes razones:

  • Es mejor solicitar subtotales y totales fuera del bucle foreach, porque de lo contrario estos valores se sobrescribirán cada vez.
  • El resultado de $subtotal no se usa en ninguna parte de su código
  • Dado que el resultado de $subtotal no se usa de todos modos, el bucle a través del carro parece innecesario
  • $sale_price tampoco se usa en ninguna parte de su código
  • Ya que $discount_total = $discount no es necesario utilizar una nueva variable
  • Se crea/añade una variable de sesión

Su código existente, pero optimizado:

function action_woocommerce_after_order_total() {
    // WC Cart NOT null
    if ( ! is_null( WC()->cart ) ) {
        // Get cart
        $cart = WC()->cart;
        
        // Getters
        $cart_total = $cart->total;
        $cart_discount_total = $cart->get_discount_total();
        
        // Settings
        $pctm = 90;
        
        // Calculations
        $discounted_value = $cart_total - ( $cart_total / 100 * $pctm );
        $discount_total = $cart_total - $discounted_value;
        
        // Greater than
        if ( $discount_total > 0 ) {
            // Result
            $result = $discount_total + $cart_discount_total;
            
            // The Output
            echo '<tr class="my-class">
                    <th>' . __( 'VOCÊ RECEBERÁ DE CASHBACK', 'woocommerce' ) . '</th>
                    <td data-title="You">' . wc_price( $result ) . '</td>
                  </tr>';
            
            // Set session
            WC()->session->set( 'session_result', $result );
        }
    }
}
add_action( 'woocommerce_cart_totals_after_order_total', 'action_woocommerce_after_order_total', 10 );
add_action( 'woocommerce_review_order_after_order_total', 'action_woocommerce_after_order_total', 10 );

Para responder tu pregunta:

Paso 1) Obtenemos el resultado de la variable de sesión y lo agregamos como datos de pedido, para que podamos usar/obtener esta información en todas partes a través de la $order objeto

// Add as custom order meta data and reset WC Session variable
function action_woocommerce_checkout_create_order( $order, $data ) {    
    // Isset
    if ( WC()->session->__isset( 'session_result' ) ) {
        // Get
        $result = (float) WC()->session->get( 'session_result' );
        
        // Add as meta data
        $order->update_meta_data( 'result', $result );
        
        // Unset
        WC()->session->__unset( 'session_result' );
    }
}
add_action( 'woocommerce_checkout_create_order', 'action_woocommerce_checkout_create_order', 10, 2 );

Paso 2) Utilizar el woocommerce_get_order_item_totals gancho de filtro, que le permitirá agregar una nueva fila a las tablas existentes con el $result.

La nueva fila se agregará en:

  • Notificaciónes de Correo Electrónico
  • Pedido recibido (página de agradecimiento)
  • Mi cuenta -> ver pedido
function filter_woocommerce_get_order_item_totals( $total_rows, $order, $tax_display ) {    
    // Get meta
    $result = $order->get_meta( 'result' );
    
    // NOT empty
    if ( ! empty ( $result ) ) {
        // Add new row
        $total_rows['total_result']['label'] = __( 'VOCÊ RECEBERÁ DE CASHBACK', 'woocommerce' );
        $total_rows['total_result']['value'] = wc_price( $result );
    }

    return $total_rows;
}
add_filter( 'woocommerce_get_order_item_totals', 'filter_woocommerce_get_order_item_totals', 10, 3 );

¿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