dailysweetness.com Ads.txt file
<script>
// Add this to your existing shop page JavaScript
class CloakedUrlManager {
constructor() {
this.cloakedUrls = new Map();
}
// Create cloaked URL for a product
async createCloakedUrl(product) {
// Check if we already have a cloaked URL for this product
const cacheKey = `${product.id}-${product.name}`;
if (this.cloakedUrls.has(cacheKey)) {
return this.cloakedUrls.get(cacheKey);
}
try {
const formData = new FormData();
formData.append('action', 'create_cloaked_url');
formData.append('product_id', product.id);
formData.append('product_name', product.name);
formData.append('affiliate_url', product.affiliateUrl);
formData.append('nonce', cloaked_nonce); // Add security nonce
const response = await fetch(ajaxurl, {
method: 'POST',
body: formData
});
const data = await response.json();
if (data.success) {
const cloakedUrl = data.data.cloaked_url;
this.cloakedUrls.set(cacheKey, cloakedUrl);
return cloakedUrl;
}
} catch (error) {
console.error('Error creating cloaked URL:', error);
}
// Fallback to original URL if cloaking fails
return product.affiliateUrl;
}
// Batch create cloaked URLs for all products
async createAllCloakedUrls(products) {
const promises = products.map(product =>
this.createCloakedUrl(product).then(cloakedUrl => ({
...product,
cloakedUrl: cloakedUrl
}))
);
return await Promise.all(promises);
}
}
// Initialize cloaked URL manager
const cloakedUrlManager = new CloakedUrlManager();
// Update your existing renderProducts function
async function renderProducts(productsToRender) {
const grid = document.getElementById('productGrid');
grid.innerHTML = '';
if (productsToRender.length === 0) {
grid.innerHTML = '<p style="text-align: center; grid-column: 1/-1;">No products found. Add URLs to your Google Sheet!</p>';
return;
}
// Create cloaked URLs for all products
const productsWithCloakedUrls = await cloakedUrlManager.createAllCloakedUrls(productsToRender);
productsWithCloakedUrls.forEach(function(product) {
const productCard = document.createElement('a');
// Use cloaked URL instead of direct affiliate URL
productCard.href = product.cloakedUrl || product.affiliateUrl;
productCard.target = '_blank';
productCard.rel = 'noopener noreferrer';
productCard.className = 'product-card';
// Add click tracking
productCard.addEventListener('click', function() {
// Optional: Send analytics event
if (typeof gtag !== 'undefined') {
gtag('event', 'click', {
event_category: 'affiliate_link',
event_label: product.name,
value: product.price.replace(/[$,]/g, '')
});
}
});
productCard.innerHTML =
'<div class="product-image">' +
'<img src="' + product.image + '" alt="' + product.name + '" onerror="this.parentElement.innerHTML=\'<div class="placeholder">Product Image</div>\'">' +
'</div>' +
'<div class="product-info">' +
'<div class="product-brand">' + product.brand + '</div>' +
'<div class="product-name">' + product.name + '</div>' +
'<div class="product-price">' + product.price + '</div>' +
'<div class="product-link">' +
'<span>' + product.brand.toUpperCase() + '</span>' +
'<svg width="12" height="12" fill="none" stroke="currentColor" viewBox="0 0 24 24">' +
'<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m7 17 10-10M17 7H7" />' +
'</svg>' +
'</div>' +
'</div>';
grid.appendChild(productCard);
});
document.getElementById('itemCount').textContent = productsWithCloakedUrls.length + ' items';
}
// Update the product loading function
document.addEventListener('DOMContentLoaded', async function() {
// Load products as before
products = await scraper.loadAllProducts();
filteredProducts = [...products];
// Render with cloaked URLs
await renderProducts(filteredProducts);
// Set up filters
document.getElementById('categoryFilter').addEventListener('change', async function() {
filterProducts();
await renderProducts(filteredProducts);
});
document.getElementById('priceFilter').addEventListener('change', async function() {
filterProducts();
await renderProducts(filteredProducts);
});
});
</script>google.com, pub-8768430194167717, DIRECT, f08c47fec0942fa0