E-Ticaret Panel
Mağazalar
Mağaza Düzenle
Mağaza Adı
XML Linki
Shopify Store Name
.myshopify.com
Access Token
API Version
2025-07 (En Güncel - Önerilen)
2025-04
2025-01
2024-10
2024-07
2024-04 (Legacy)
2024-01 (Legacy)
Mevcut: 2025-07
Kontrol Süresi
Saniye
Dakika
Saat
Gün
Product Path (Opsiyonel)
XML'de ürünlerin bulunduğu path
🏷️ Vendor (Marka) Filtreleme
📦 Tüm markalar işleniyor
← Ana sayfadan "Filtre Ekle" butonuyla vendor seçimi yapabilirsiniz
Converter Kodunuz
module.exports = function convert (item, utils = {}) { /* -------------------- helpers -------------------- */ const txt = v => Array.isArray(v) ? txt(v[0]) : (v == null ? '' : String(v).trim()); const uniq = a => [...new Set(a.filter(Boolean).map(s => s.trim()))]; const num = s => { const str = String(s || '').trim(); if (!str) return 0; if (str.includes(',') && str.includes('.')) return Number.parseFloat(str.replace(/,/g, '')) || 0; // 4,400.00 if (str.includes(',') && !str.includes('.')) return Number.parseFloat(str.replace(',', '.')) || 0; // 4,50 return Number.parseFloat(str) || 0; }; const strip= s => String(s || '').replace(/<[^>]*>/g, ' ').replace(/\s+/g, ' ').trim(); const slug = s => s.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, ''); /* 1️⃣ unwrap list */ if (!item) return []; if (item.itemlist?.item || item.Root?.item) { const list = item.itemlist?.item || item.Root.item; const arr = Array.isArray(list) ? list : [list]; return arr.flatMap(u => convert(u, utils)); } /* 2️⃣ fields */ const code = txt(item.kod); const renk = txt(item.renk_kodu) || 'Renk Yok'; const barkod = txt(item.barkod); const titleRaw = txt(item.urunadi) || strip(txt(item.aciklama)) || code; const titleBase = utils.normalizeTitle ? utils.normalizeTitle(titleRaw) : titleRaw; const title = titleBase; /* 3️⃣ images */ const imgKeys = ['resim','resim2','resim3','resim4','resim5','resim6']; const images = uniq(imgKeys.map(k => txt(item[k]))).filter(Boolean); /* 4️⃣ paket_yapisi */ const paketStr = txt(item.paket_yapisi); // örn. "1S+1M+1L+1XL" /* range hala Option1 için lazım */ function parsePaket(str){ if(!str) return []; return str.split('+').map(s=>s.trim()).filter(Boolean).map(seg=>{ const m = seg.match(/^(\d+)([A-Za-zÇĞİÖŞÜ].*)$/); if(m) return {size:m[2],cnt:Number(m[1])}; return {size:seg,cnt:1}; }); } const sizeList = parsePaket(paketStr); const sizesOnly = sizeList.map(o=>o.size); const alphaOrder=['XS','S','M','L','XL','XXL','3XL','4XL','5XL']; const orderIndex=(s)=>{const up=s.toUpperCase();const ai=alphaOrder.indexOf(up);if(ai>=0) return ai+100;const n=parseInt(up,10);return Number.isFinite(n)? n : 1000+up.charCodeAt(0);} sizesOnly.sort((a,b)=>orderIndex(a)-orderIndex(b)); const isNumeric = sizesOnly.every(sz=>/^[0-9]+$/.test(sz)); const rangeFirst = (isNumeric && sizesOnly.length>=3)? sizesOnly[1] : sizesOnly[0]; const rangeLast = sizesOnly[sizesOnly.length-1]||rangeFirst; const rangeStr = `(${rangeFirst===rangeLast?rangeFirst:`${rangeFirst}-${rangeLast}`})`; /* 5️⃣ description — YENİ */ const descLines = [`Paket Yapısı: ${paketStr}`, strip(txt(item.aciklama))].filter(Boolean); const desc = descLines.join('<br/>'); const seoDesc = strip(desc).slice(0,160); /* 6️⃣ inventory */ const stockQty = num(item.stok); /* 7️⃣ grouping */ const handle = utils.toHandle ? utils.toHandle(code) : slug(code); const PK = handle; /* 8️⃣ category / tags */ const catParts = txt(item.kategoriler).split('>').map(s=>s.replace(/\|/g,'').trim()).filter(Boolean); const type = catParts[0] || ''; const tags = uniq([...catParts, renk]).join(','); /* 9️⃣ pricing - TL'den USD'ye çeviri */ const USD_RATE = 1; // Güncel dolar kuru const fiyatTL = num(item.fiyat); const discTL = num(item.indirimlifiyat); // TL fiyatlarını USD'ye çevir const fiyat = fiyatTL / USD_RATE; const disc = discTL / USD_RATE; const price = disc > 0 ? disc : fiyat; const comp = disc > 0 ? fiyat : ''; /* 🔟 variant row */ const variantSku = barkod || `${code}-${renk}`; const row = { '__PRODUCT_KEY': PK, 'Handle' : handle, 'Title' : title, 'Body (HTML)' : desc, 'Vendor' : txt(item.marka)||'PuaneStore', 'Type' : type, 'Tags' : tags, 'Published' : 'TRUE', 'Option1 Name' : 'Beden','Option1 Value': rangeStr, 'Option2 Name' : 'Renk', 'Option2 Value': renk, 'Variant SKU' : variantSku, 'Variant Barcode': barkod, 'Variant Inventory Qty': stockQty.toString(), 'Variant Inventory Tracker':'shopify', 'Variant Inventory Policy':'deny', 'Variant Fulfillment Service':'manual', 'Variant Price' : price.toFixed(2), 'Variant Compare At Price': comp ? comp.toFixed(2) : '', 'Variant Requires Shipping':'TRUE', 'Variant Taxable':'TRUE', 'Variant Image' : images[0] || '', 'Image Src' : images[0] || '', 'Image Position': images.length? '1' : '', 'Image Alt Text': `${titleBase} - ${renk}`, 'SEO Title' : `${titleBase} - ${renk}`, 'SEO Description': seoDesc, 'Status' : 'active' }; /* 11️⃣ extra images */ const rows=[row]; for(let i=1;i<images.length;i++) rows.push({'__PRODUCT_KEY':PK,'Handle':handle,'Image Src':images[i],'Image Position':String(i+1)}); return rows; };
Güncelle
İptal
İstatistikler
Toplam Çalışma
1330
Başarı Oranı
8%
İşlenen Ürün
0
Push Edilen
0