Implementar Denorly en WooCommerce
Método manual. El Libro de Reclamaciones es obligatorio por ley en tu tienda Woo: esto lo deja a ≤1 clic en todo el sitio.
El plugin nativo de WooCommerce está planificado (incluye pre-llenado con datos del pedido y enganche al checkout). Mientras tanto, este método manual cubre lo legalmente exigible.
a) Libro de Reclamaciones site-wide (obligatorio)
| Requisito legal | Qué significa |
|---|---|
| Ley 29571 / 32495 | Todo ecommerce en Perú debe ofrecer un Libro de Reclamaciones virtual. |
| ≤ 1 clic | Accesible desde la home con un solo clic. Un botón flotante site-wide lo cumple. |
Opción 1: PHP en el theme (recomendado)
Inyecta el widget en wp_footer desde el functions.php de tu child theme. Sale en todas las páginas, incluido el checkout.
<?php
// functions.php (child theme)
add_action('wp_footer', function () {
?>
<script src="https://app.denorly.com/assets/libro-widget.js"
data-token="8f3b2c1a-9d4e-4f7a-b6c2-1e5a7d9c0b3f"
data-position="bottom-right"
data-color="#E8A817"
data-text="Libro de Reclamaciones"
data-mode="modal"
async></script>
<?php
});
Opción 2: Widget HTML en el footer
Sin tocar PHP: Apariencia → Widgets → área del footer → bloque HTML personalizado → pega solo el <script> (sin el PHP). Tabla de atributos en Libro embed.
b) Form de contacto / reclamo a un endpoint Denorly
Para un form de contacto o reclamo propio (aparte del Libro), pega este HTML en cualquier página o bloque.
<form id="woo-contacto">
<input type="text" name="nombre" placeholder="Nombre" required>
<input type="email" name="email" placeholder="Email" required>
<input type="text" name="pedido" placeholder="N° de pedido (opcional)">
<textarea name="mensaje" placeholder="Tu consulta o reclamo"></textarea>
<button type="submit">Enviar</button>
<p id="woo-msg"></p>
</form>
<script>
document.getElementById("woo-contacto").addEventListener("submit", async (e) => {
e.preventDefault();
const data = Object.fromEntries(new FormData(e.target));
const res = await fetch("https://denorly.com/f/8f3b2c1a-9d4e-4f7a-b6c2-1e5a7d9c0b3f", {
method: "POST",
headers: { "Content-Type": "application/json", "Accept": "application/json" },
body: JSON.stringify(data),
});
const json = await res.json();
document.getElementById("woo-msg").textContent = json.success ? "¡Enviado!" : json.error;
if (json.success) e.target.reset();
});
</script>
El campo pedido es solo un input más: se guarda tal cual en la submission. No hay esquema fijo: lo que mandas es lo que se guarda.
c) Pre-llenado con datos del pedido
Planificado. El pre-llenado automático con datos del pedido (cliente, N° de orden, items) y el enganche nativo al flujo de checkout llegan con el plugin de WooCommerce. Por ahora, pasa el N° de pedido como un input manual (arriba) o pre-rellénalo tú con PHP del objeto $order si lo incrustas en una página de pedido.
⚠ Gotchas WooCommerce
- El widget del Libro debe cargar en toda la tienda, checkout incluido. El hook
wp_footerlo garantiza; un bloque suelto en una sola página no cumple el "≤1 clic desde la home". - Plugins de caché y "optimización JS" pueden diferir o romper el
<script>. Excluyelibro-widget.jsde la minificación/combinación si no carga. - Status de error del POST:
402límite del plan,403origen bloqueado,404form inactivo,400validación. El motivo viene enjson.error(string único).