(function($) { /********************** BEGIN CHECKOUT ******************/ $(document).on('click', '.woocommerce-mini-cart__buttons .checkout, .wc-proceed-to-checkout a', function(e) { e.preventDefault(); // Prevenir la redirección inmediata var checkoutUrl = $(this).attr('href'); // Llamada Ajax para obtener los datos del carrito $.ajax({ url: gtmAjax.ajax_url, type: 'POST', data: { action: 'get_cart_items', nonce: gtmAjax.nonce // Incluir el nonce }, success: function(response) { if (response.success) { var cartItems = response.data; // Calcular el valor total del carrito var totalValue = cartItems.reduce(function(sum, item) { return sum + (item.price * item.quantity); }, 0); // Disparar el evento begin_checkout gtag('event', 'begin_checkout', { currency: 'COP', // Cambia esto si usas otra moneda value: totalValue, items: cartItems }); console.log('Evento begin_checkout enviado:', JSON.stringify({ currency: 'COP', value: totalValue, items: cartItems })); // Redirigir al checkout después de un breve retraso setTimeout(function() { window.location.href = checkoutUrl; }, 300); } else { console.warn('Error al obtener los datos del carrito:', response.data); } }, error: function(error) { console.error('Error en la solicitud Ajax:', error); } }); }); /********************** ADD TO CART ******************/ //.add_to_cart_button, .single_add_to_cart_button $(document).on('click', '.add_to_cart_button:not(.product_type_variable)', function(e) { e.preventDefault(); // Prevenir comportamiento predeterminado si es necesario // Obtener datos del producto desde el DOM var productId = $(this).data('product_sku') != "" ? $(this).data('product_sku') : $(this).data('product_id'); var productName = $(this).data('product_name') || $(this).closest('.product').find('.woocommerce-loop-product__title').text().trim(); var productPrice = parseFloat($(this).data('price')) || 0; var categories = $(this).data('category'); // Dividir la cadena en un array de categorías var categoryArray = categories.split(',').map(function(item) { return item.trim(); // Eliminar espacios extra }); // Obtener la primera categoría var productCategory = categoryArray[0] ?? ""; // Enviar evento add_to_cart gtag('event', 'add_to_cart_holy', { currency: 'COP', // Cambia según tu moneda value: productPrice, items: [{ item_id: productId.toString(), item_name: productName, price: productPrice, quantity: 1, item_category: productCategory, }] }); console.log('Evento add_to_cart_holy enviado (categoría):', JSON.stringify({ currency: 'COP', // Cambia según tu moneda value: productPrice, items: [{ item_id: productId, item_name: productName, price: productPrice, quantity: 1, item_category: productCategory, }] })); // Opcional: Si quieres que el enlace funcione, descomenta esto // window.location.href = $(this).attr('href'); }); $(document).on('submit', 'form.cart', function(e) { // Obtener el formulario var form = $(this); // Prevenir múltiples envíos del evento if (form.data('gtag-sent')) { return true; // Continuar con el comportamiento normal } // Obtener datos del producto var productId = form.find('[name="add-to-cart"]').val(); var productName = form.closest('.product').find('.product-title').first().contents().filter(function() { return this.nodeType === Node.TEXT_NODE; // Solo nodos de texto }).text().trim(); var productPrice = parseFloat($('#product_final_price').val()) || 0; var productQuantity = parseInt(form.find('[name="quantity"]').val()) || 1; // Obtener el SKU, si no está disponible, usar el ID var productSku = form.closest('.product').find('.sku').text().trim() || productId; // Obtener la primera categoría desde .posted_in var categories = form.closest('.product').find('.posted_in a').map(function() { return $(this).text().trim(); }).get(); var firstCategory = categories.length > 0 ? categories[0] : 'Uncategorized'; var variations = form.find('.variations select').map(function() { return $(this).find('option:selected').text().trim(); // Obtener el texto seleccionado }).get().join(', '); // Validar que todos los campos requeridos estén disponibles if (!productId || !productName || !productPrice || !productSku || !firstCategory || productQuantity <= 0) { console.warn('Datos incompletos para enviar el evento add_to_cart:', { productId, productName, productPrice, productSku, firstCategory, productQuantity }); return true; // Continuar con el comportamiento normal } // Marcar el formulario como procesado para evitar múltiples envíos del evento form.data('gtag-sent', true); console.log('Evento add_to_cart_holy enviado (producto):', JSON.stringify({ currency: 'COP', // Cambia según tu moneda value: productPrice * productQuantity, items: [{ item_id: productSku, // Usar SKU si está disponible, de lo contrario el ID item_name: productName, price: productPrice, quantity: productQuantity, item_category: firstCategory, // Usar la primera categoría item_variant: variations }] })); // Enviar el evento add_to_cart a Google Analytics gtag('event', 'add_to_cart_holy', { currency: 'COP', // Cambia según tu moneda value: productPrice * productQuantity, items: [{ item_id: productSku, // Usar SKU si está disponible, de lo contrario el ID item_name: productName, price: productPrice, quantity: productQuantity, item_category: firstCategory, // Usar la primera categoría item_variant: variations }] }); // Permitir que el formulario se envíe normalmente return true; }); /********************* SEARCH EVENT *****************/ let debounceTimer; function debounce(func, delay) { clearTimeout(debounceTimer); debounceTimer = setTimeout(func, delay); } $(document.body).on('input', '#dgwt-wcas-search-input-1', function() { let searchQuery = $(this).val().trim(); // Obtener la búsqueda actual // Solo ejecutar si hay más de 2 caracteres y esperar 500ms debounce(function() { if (searchQuery.length > 2) { console.log('Evento search enviado:', JSON.stringify({ search_term: searchQuery })); gtag("event", "search", { search_term: searchQuery }); } }, 750); }); /**************** REMOVE FROM CART ****************/ $(document.body).on('click', 'td.product-remove .remove', function (event) { event.preventDefault(); // Evitar el comportamiento predeterminado console.log('Evento remove_from_cart enviado:', JSON.stringify({ currency: "COP", value: $(this).data('product_price'), items: [{ item_id: $(this).data('product_id').toString(), item_name: $(this).data('product_name'), price: $(this).data('product_price'), quantity: 1, item_category: $(this).data('category'), }] })); gtag("event", "remove_from_cart", { currency: "COP", value: $(this).data('product_price'), items: [{ item_id: $(this).data('product_id').toString(), item_name: $(this).data('product_name'), price: $(this).data('product_price'), quantity: 1, item_category: $(this).data('category'), }] }); // Lógica adicional aquí }); })(jQuery); /**************** REMOVE FROM CART ****************/ // cuando se actualiza el carrito en minicart (function() { const originalXHROpen = XMLHttpRequest.prototype.open; const originalXHRSend = XMLHttpRequest.prototype.send; XMLHttpRequest.prototype.open = function(method, url, async, user, password) { this._url = url; // Guarda la URL para usarla en send return originalXHROpen.apply(this, arguments); }; XMLHttpRequest.prototype.send = function(body) { console.log(this._url); if (this._url && this._url.includes("admin-ajax.php")) { const params = new URLSearchParams(body); const action = params.get("action"); if (action === "remove_from_mini_cart_complete" || action === "remove_from_mini_cart") { jQuery.ajax({ url: gtmAjax.ajax_url, method: "POST", data: { action: "get_cart_item_details", cart_item_key: Object.fromEntries(params).cart_item_key }, success: function (response) { if (response.success) { if ((response.data.quantity == 1 && action === "remove_from_mini_cart") || action === "remove_from_mini_cart_complete") { console.log('Evento remove_from_cart enviado:', JSON.stringify({ currency: "COP", value: response.data.price, items: [response.data] })); gtag("event", "remove_from_cart", { currency: "COP", value: response.data.price, items: [response.data] }); } } }, error: function (xhr) { console.error("Error en la solicitud:", xhr.responseJSON); } }); // Aquí puedes disparar tus eventos personalizados o realizar acciones } } return originalXHRSend.apply(this, arguments); }; })(); (function () { const originalOpen = XMLHttpRequest.prototype.open; const originalSend = XMLHttpRequest.prototype.send; XMLHttpRequest.prototype.open = function (method, url, ...rest) { this._url = url; // Guarda la URL para usarla en send this._method = method; // Guarda el método para referencia return originalOpen.apply(this, [method, url, ...rest]); }; XMLHttpRequest.prototype.send = function (body) { if (this._url && this._url.includes('carrito-de-compras')) { if (typeof body === 'string') { console.log('Cuerpo (texto):', body); jQuery.ajax({ url: gtmAjax.ajax_url, method: "POST", data: { action: "get_cart_items_by_qty_zero", query_string: body }, success: function (response) { if (response.success) { let price = 0; response.data.products.forEach(product => { price += product.price; }); console.log('Evento remove_from_cart enviado:', JSON.stringify({ currency: "COP", value: price, items: response.data.products })); gtag("event", "remove_from_cart", { currency: "COP", value: price, items: response.data.products }); } }, error: function (xhr) { console.error("Error en la solicitud:", xhr.responseJSON); } }); } } return originalSend.apply(this, [body]); }; })(); /********* VIEW ITEM LIST **********/ jQuery(document).ready(function ($) { let trackedProducts = new Set(); // Almacena los IDs de los productos ya enviados let throttleTimer; const getItemListName = () => { let breadcrumbNav = $('.woocommerce-breadcrumb.breadcrumbs').first(); let breadcrumbText = breadcrumbNav.text().trim(); let breadcrumbItems = breadcrumbText.split('/').map(item => item.trim()).filter(item => item !== ''); let breadcrumbCount = breadcrumbItems.length; let itemListName = ''; if (breadcrumbCount > 3) { itemListName = `${breadcrumbItems[breadcrumbCount - 2]}, ${breadcrumbItems[breadcrumbCount - 1]}`; } else { itemListName = breadcrumbItems[breadcrumbCount - 1]; } if (!itemListName) { if ($('.home').length) { itemListName = 'Home'; } else { itemListName = 'Related Products'; } } return itemListName; }; const sendViewItemListEvent = (products) => { const newProducts = products.filter(function (index, product) { const productId = $(product).data('product_sku'); return productId && !trackedProducts.has(productId); }); if (newProducts.length > 0) { const items = newProducts.map((index, product) => { const $product = $(product); const productId = $product.data('product_sku'); trackedProducts.add(productId); // Marca el producto como rastreado return { item_id: productId, item_name: $product.data('product_name'), price: parseFloat($product.data('price')), item_category: $product.data('category') }; }).get(); console.log('Evento view_item_list enviado:', JSON.stringify({ item_list_id: 'category_list', item_list_name: getItemListName(), items: items })); gtag('event', 'view_item_list', { item_list_id: 'category_list', item_list_name: getItemListName(), items: items }); } }; const trackVisibleProducts = () => { const visibleProducts = $('.add_to_cart_button'); sendViewItemListEvent(visibleProducts); }; const throttledTrackVisibleProducts = () => { clearTimeout(throttleTimer); throttleTimer = setTimeout(() => { trackVisibleProducts(); }, 500); // Ajusta el tiempo de espera según sea necesario }; // Initial page load trackVisibleProducts(); // Observe for new product additions (infinite scroll) const observer = new MutationObserver(() => { throttledTrackVisibleProducts(); // Throttle product tracking }); observer.observe(document.querySelector('.products'), { childList: true, subtree: true }); }); /************ LOGIN ************/ jQuery(document).ready(function ($) { let googleLoginEventSent = false; const trackLoginEvent = (method) => { console.log('Evento login enviado:', JSON.stringify({ method: method })); gtag('event', 'login', { method: method }); }; // Evento para el botón de Facebook $('body').on('click', '.woo-slg-social-login-facebook', function () { trackLoginEvent('Facebook'); }); // Evento para el botón de Google const originalOpen = XMLHttpRequest.prototype.open; XMLHttpRequest.prototype.open = function(method, url, async, user, password) { this.addEventListener('readystatechange', function() { if (!googleLoginEventSent && this.readyState === 4 && this.responseURL.includes('admin-ajax.php')) { const formData = this.responseText; // Capturar respuesta si es necesario // Intentar extraer el payload del cuerpo de la solicitud const requestData = this._data; // Propiedad personalizada que definimos a continuación if (requestData && requestData.includes('action=woo_slg_social_login') && requestData.includes('type=googleplus')) { // Disparar el evento de login con Google googleLoginEventSent = true; trackLoginEvent('Google'); } } }); originalOpen.apply(this, arguments); }; // Sobrescribir el método send para acceder al cuerpo de la solicitud const originalSend = XMLHttpRequest.prototype.send; XMLHttpRequest.prototype.send = function(data) { this._data = data; // Guardamos los datos enviados en una propiedad personalizada originalSend.apply(this, arguments); }; // Detectar clic en el botón principal del contenedor $('body').on('click', '.woo-slg-social-login-googleplus', function () { trackLoginEvent('Google'); }); // Usar un MutationObserver para detectar cambios en el iframe const observer = new MutationObserver(function (mutationsList) { mutationsList.forEach(function (mutation) { if (mutation.type === 'attributes' && mutation.attributeName === 'src') { const iframeSrc = mutation.target.src; if (iframeSrc.includes('accounts.google.com')) { trackLoginEvent('Google'); } } }); }); // Aplicar el observador al iframe específico $('iframe').each(function () { if ($(this).attr('src') && $(this).attr('src').includes('accounts.google.com')) { observer.observe(this, { attributes: true }); } }); // Evento para el botón de inicio de sesión de la web $('body').on('click', '.woocommerce-button.woocommerce-form-login__submit, .woocommerce-form-register__submit', function () { trackLoginEvent('Website'); }); }); /************ VIEW PROMOTION - SELECT PROMOTION ***********/ jQuery(document).ready(function ($) { const trackedPromotions = new Set(); // Usar Set para almacenar promociones ya vistas const triggerViewPromotion = () => { const visibleBanner = $('.flickity-slider > div').filter(function () { return !$(this).attr('aria-hidden'); // Banner visible no tiene aria-hidden }); if (visibleBanner.length) { const promotionLink = visibleBanner.find('a[rel]'); if (promotionLink.length) { const promotionName = promotionLink.attr('rel') || 'Unknown Promotion'; if (!trackedPromotions.has(promotionName)) { console.log('Evento view_promotion enviado:', JSON.stringify({ creative_name: "", creative_slot: "", promotion_id: "", promotion_name: promotionName })); gtag("event", "view_promotion", { creative_name: "", creative_slot: "", promotion_id: "", promotion_name: promotionName }); trackedPromotions.add(promotionName); } } } }; // Adjuntar manejador de eventos para select_promotion usando delegación $('body').on('click', '.flickity-slider a[rel]', function () { const promotionName = $(this).attr('rel') || 'Unknown Promotion'; console.log('Evento select_promotion enviado:', JSON.stringify({ creative_name: "", creative_slot: "", promotion_id: "", promotion_name: promotionName })); gtag("event", "select_promotion", { creative_name: "", creative_slot: "", promotion_id: "", promotion_name: promotionName }); }); triggerViewPromotion(); setInterval(triggerViewPromotion, 1000); });