Entrada Test

Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry’s standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.

Titulo 2

Lorem Ipsum is simply dummy text of the printing and typesetting industry.

Lorem Ipsum has been the industry’s standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.

Si tienes una tienda en WooCommerce, seguro que más de una vez un cliente ha querido guardar una captura de su pedido. Claro, puede hacerlo manualmente, pero ¿qué tal si le facilitamos las cosas? Con un solo clic, podemos generar una captura limpia del pedido, eliminando elementos innecesarios como botones, cabecera, pie de página y el menú de «Mi cuenta». Además, agregaremos los datos de nuestra tienda y un aviso aclarando que se trata de un recibo informativo, no una factura legal. En este artículo, te mostraré cómo hacerlo fácilmente con un botón en la página de pedidos.

recibos woocommerce

¿Qué Hace Este Código?

El código que te comparto añade un botón en la página de pedidos de WooCommerce que, cuando se presiona, captura los detalles del pedido y los guarda como una imagen (.png).

Esto es útil para que los clientes puedan almacenar fácilmente su información sin necesidad de imprimir o copiar datos manualmente.

capturar pedido woocommerce recibos

Cómo Funciona el Código

Voy a explicarte paso a paso lo que hace este código:

  1. Añadir el Botón «Capturar Detalles del Pedido»
    • Se inserta un botón en la página de pedidos del usuario en WooCommerce.
    • Se utiliza el hook woocommerce_order_details_before_order_table para colocar el botón justo antes de la tabla del pedido.
  2. Importar la Librería html2canvas
    • La función de captura utiliza html2canvas, una librería de JavaScript que permite tomar capturas de pantalla de elementos HTML.
  3. Preparar la Captura de Pantalla
    • Cuando el usuario hace clic en el botón, se selecciona el contenedor donde están los detalles del pedido.
    • Se ocultan los elementos innecesarios (botón, enlaces, acciones de pedido) para que la imagen sea más limpia.
    • Se añade un mensaje que dice: «ESTO NO ES UNA FACTURA LEGAL, SOLO UN RECIBO», ideal para evitar confusiones.
  4. Generar la Imagen del Pedido
    • Se clona el contenido del pedido dentro de un contenedor especial con estilos personalizados.
    • Se incluyen los detalles de la tienda (nombre, dirección, contacto).
  5. Descargar la Captura en PNG
    • Una vez que html2canvas genera la imagen, se crea un enlace de descarga automática con el nombre pedido_ID.png, donde ID es el número del pedido.
    • Luego, se eliminan los estilos temporales y el contenedor usado para la captura.

¿Cómo Eliminar Otros Elementos del Pedido de la Captura?

Si en tu tienda WooCommerce tienes otros elementos personalizados en la página de pedidos y quieres ocultarlos en la captura, puedes hacerlo fácilmente identificando sus clases o IDs y agregándolos a la lista de estilos ocultos en el código.

Paso 1: Identificar el Elemento a Ocultar

Para ocultar cualquier elemento extra en la captura, primero necesitas identificar su clase o ID. Sigue estos pasos:

  1. Abre la página de pedidos en tu tienda WooCommerce.
  2. Haz clic derecho sobre el elemento que deseas ocultar y selecciona «Inspeccionar» (en Chrome) o «Inspeccionar elemento» (en Firefox).
  3. Busca el atributo class o id del elemento en el código HTML.

Por ejemplo, si tienes un botón adicional con la clase .mi-boton-personalizado, así se vería en el inspector:

Copiar<button class="mi-boton-personalizado">Descargar PDF</button>

Paso 2: Agregar la Clase o ID al Código

Una vez identificada la clase o el ID del elemento que deseas ocultar, agrégalo a la sección de estilos ocultos en el código.

Ubicación en el código:
Dentro del bloque donde se define estilosOcultos.innerHTML, simplemente añade la nueva clase o ID con display: none !important;.

Ejemplo de cómo se ocultan más elementos personalizados:

CopiarestilosOcultos = document.createElement("style");
estilosOcultos.innerHTML = `
.woocommerce-button,
.capturar-pedidos,
.order-actions--heading,
.order-again,
.order-actions--heading td,
.mi-boton-personalizado, /* Ocultar botón personalizado */
#elemento-que-quiero-ocultar, /* Ocultar un elemento específico por su ID */
.otra-clase-a-ocultar /* Ocultar otro elemento por su clase */
{
display: none !important;
}
`;

Nota: Si el elemento que quieres ocultar tiene un id, usa #id-del-elemento en lugar de .nombre-de-clase.

Siguiendo estos pasos puedes limpiar aún más la captura, eliminando cualquier otro botón, enlace o sección innecesaria que no quieras que aparezca en la imagen. Solo necesitas inspeccionar la página, identificar la clase o ID del elemento y agregarlo a la sección de estilos en el código.

El siguiente código tienes que agregarlo en el functions.php de tu tema hijo o utilizar un plugin como CODE SNIPPETS. También puedes crear tu propio plugin con unos simples pasos.

Copiar// Agregar el botón de captura de pantalla en la página de pedidos
add_action('woocommerce_order_details_before_order_table', 'agregar_boton_captura_pedido');
function agregar_boton_captura_pedido($order){
    ?>
    <button class="capturar-pedidos woocommerce-button button btn" id="capturaPedido" style="margin-bottom: 20px;">
        Capturar Detalles del Pedido
    </button>

    <script src="https://html2canvas.hertzen.com/dist/html2canvas.min.js"></script>
    <script>
        document.getElementById("capturaPedido").addEventListener("click", function() {
            let pedidoDiv = document.querySelector(".woocommerce-MyAccount-content");

            // Ocultar elementos no deseados antes de la captura
            let estilosOcultos = document.createElement("style");
            estilosOcultos.innerHTML = `
                .woocommerce-button,
                .capturar-pedidos,
                .order-actions--heading, 
                .order-again, 
                .order-actions--heading td {
                    display: none !important;
                }
                .captura-container {
                    padding: 30px;
                    background: white;
                    text-align: center;
                    border: 2px solid #ccc;
                    border-radius: 10px;
                    box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
                }
                .captura-header {
                    margin-bottom: 20px;
                    padding: 10px;
                    border-bottom: 2px solid #0071a1;
                }
                .captura-header h2 {
                    color: #0071a1;
                    font-size: 20px;
                    font-weight: bold;
                    margin-bottom: 10px;
                }
                .store-details {
                    text-align: left;
                    font-size: 14px;
                    line-height: 1.5;
                    margin-top: 10px;
                }
                .billing-details {
                    text-align: left;
                    font-size: 14px;
                    line-height: 1.5;
                    margin: 20px auto;
                    padding: 15px;
                    border: 1px solid #ddd;
                    border-radius: 8px;
                    max-width: 600px;
                    background-color: #f9f9f9;
                }
            `;
            document.head.appendChild(estilosOcultos);

            // Crear un div temporal con padding y aviso
            let capturaContainer = document.createElement("div");
            capturaContainer.classList.add("captura-container");

            // Crear cabecera con aviso y detalles de la tienda
            let capturaHeader = document.createElement("div");
            capturaHeader.classList.add("captura-header");

            // Agregar el aviso
            let aviso = document.createElement("h2");
            aviso.innerText = "ESTO NO ES UNA FACTURA LEGAL, SOLO UN RECIBO";
            capturaHeader.appendChild(aviso);

            // Agregar los datos de la tienda
            let storeDetails = document.createElement("div");
            storeDetails.classList.add("store-details");

            let storeInfo = document.createElement("p");
            storeInfo.innerHTML = `
                <strong>Nombre de la Tienda</strong><br>
                Dirección de la Tienda<br>
                Teléfono: +34 600 000 000<br>
                Email: tienda@example.com
            `;
            storeDetails.appendChild(storeInfo);

            capturaHeader.appendChild(storeDetails);

            // Agregar la cabecera al contenedor principal
            capturaContainer.appendChild(capturaHeader);

            // Clonar el contenido del pedido
            let pedidoContent = pedidoDiv.cloneNode(true);
            // Eliminar duplicación de detalles de facturación
            let billingDetailsOriginal = pedidoContent.querySelector(".woocommerce-customer-details");
            if (billingDetailsOriginal) {
                billingDetailsOriginal.remove();
            }
            capturaContainer.appendChild(pedidoContent);

            // Estilo para detalles de facturación
            let billingDetails = document.createElement("div");
            billingDetails.classList.add("billing-details");
            billingDetails.innerHTML = pedidoDiv.querySelector(".woocommerce-customer-details").outerHTML;
            capturaContainer.appendChild(billingDetails);

            document.body.appendChild(capturaContainer);

            // Asegurar que las imágenes están completamente cargadas
            const images = capturaContainer.querySelectorAll("img");
            let loadedImages = 0;

            images.forEach((img) => {
                if (img.complete) {
                    loadedImages++;
                } else {
                    img.onload = () => {
                        loadedImages++;
                        if (loadedImages === images.length) {
                            capturarPantalla(capturaContainer, estilosOcultos);
                        }
                    };
                    img.onerror = () => {
                        loadedImages++;
                        if (loadedImages === images.length) {
                            capturarPantalla(capturaContainer, estilosOcultos);
                        }
                    };
                }
            });

            if (loadedImages === images.length) {
                capturarPantalla(capturaContainer, estilosOcultos);
            }
        });

        function capturarPantalla(container, estilosOcultos) {
            html2canvas(container, {
                scrollY: 0,
                useCORS: true,
            }).then(canvas => {
                let link = document.createElement("a");
                link.href = canvas.toDataURL("image/png");
                link.download = "pedido_<?php echo $order->get_id(); ?>.png";
                document.body.appendChild(link);
                link.click();
                document.body.removeChild(link);

                // Restaurar los elementos ocultos y eliminar el contenedor temporal
                document.head.removeChild(estilosOcultos);
                document.body.removeChild(container);
            });
        }
    </script>
    <?php
}

Lenguaje del código: PHP (php)Copiar

Explicación Técnica del Código

1. Agregar el botón de captura en la página de pedidos

Función: agregar_boton_captura_pedido
Propósito:
Añade un botón en la página de detalles del pedido dentro del área de «Mi cuenta» en WooCommerce.

Componentes:
  • Hook: woocommerce_order_details_before_order_table → Ubica el botón antes de la tabla de productos del pedido.
  • HTML: Crea un botón <button> con una clase personalizada capturar-pedidos.
  • JS externo: Carga la librería html2canvas para tomar capturas de pantalla.
Qué hace:

Cuando el usuario haga clic en el botón, se ejecutará un script para generar la imagen del pedido.

2. Manejar el clic en el botón y preparar la captura

Evento: document.getElementById("capturaPedido").addEventListener("click", function() {...})
Propósito:
Escucha el evento de clic en el botón y ejecuta la función que prepara la captura del pedido.

Componentes:
  1. Seleccionar el contenedor del pedido:
    • let pedidoDiv = document.querySelector(".woocommerce-MyAccount-content");
    • Se obtiene el área donde están los detalles del pedido.
  2. Ocultar elementos innecesarios:
    • Se crea un <style> con display: none !important; para ocultar botones, enlaces y secciones no deseadas.
    • Se agregan estilos adicionales para mejorar la presentación de la captura.
  3. Crear un contenedor temporal para la captura:
    • Se genera un <div class="captura-container"> donde se insertarán los datos limpios.
    • Se añaden elementos como:
      • Un aviso que indica que la captura no es una factura legal.
      • Los datos de la tienda (nombre, dirección, teléfono, email).
      • Una copia de los detalles del pedido.
      • Los datos de facturación en un contenedor separado.
  4. Añadir el contenedor al DOM temporalmente:
    • document.body.appendChild(capturaContainer);

3. Capturar la pantalla y descargar la imagen

Función: capturarPantalla(container, estilosOcultos)
Propósito:
Genera la imagen con html2canvas, la convierte a formato PNG y la descarga automáticamente.

¿Te ha resultado útil este contenido? Demuéstralo con corazones.

Total de corazones: 0

Deja un comentario