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
✅
1 marka
seçili:
Hilal Akıncı Kids
← Ana sayfadan "Filtre Ekle" butonuyla vendor seçimi yapabilirsiniz
Converter Kodunuz
/* * Lustrin XML → Shopify CSV converter (güncellenmiş sürüm – Teknik Detaylarda "Beden" filtreli) * 04 Ağustos 2025 * -------------------------------------------------------- * • Option1 = Beden * • Option2 = Renk * • Option3 = (kullanılmıyor) * • Varyanta ait TÜM görseller Shopify'a doğru bağlanır (Variant Image + Option değerleri). * • Açıklama alanı: <Aciklama> içeriği + perakende alıcısı için okunaklı "Teknik Detaylar" listesi eklenir. * • Teknik Detaylar listesine "Beden" başlıklı satırlar eklenmez. */ module.exports = function convert(item, utils = {}) { /* ---- helper functions ---- */ const text = v => { if (v == null) return ''; if (Array.isArray(v)) return text(v[0]); if (typeof v === 'object') { if ('_' in v) return String(v._).trim(); if ('Deger' in v) return String(v.Deger).trim(); if ('Tanim' in v) return String(v.Tanim).trim(); return ''; } return String(v).trim(); }; const num = v => Number.parseFloat(String(v ?? '').replace(',', '.')) || 0; const uniq = a => [...new Set(a.filter(Boolean).map(s=>s.trim()))]; const strip= s => String(s||'').replace(/<[^>]*>/g,' ').replace(/\s+/g,' ').trim(); /* ---- unwrap list ---- */ if(!item) return []; if(item.Root?.Urunler?.Urun || item.Urunler?.Urun){ const list=item.Root?.Urunler?.Urun || item.Urunler?.Urun; const arr = Array.isArray(list)? list:[list]; return arr.flatMap(u=>convert(u,utils)); } if(item.Urun) item=item.Urun; /* ---- basic fields ---- */ const id = text(item.UrunKartiID); const rawTitle = text(item.UrunAdi)||'İsimsiz Ürün'; const title = utils.normalizeTitle? utils.normalizeTitle(rawTitle):rawTitle; const vendor= utils.normalizeVendor? utils.normalizeVendor(text(item.Marka)) : (text(item.Marka)||'Lustrin'); const type = text(item.Kategori); const tags = text(item.KategoriTree); /* ---- top‑level images ---- */ let topImages=[]; (()=>{ let r=item.Resimler; if(Array.isArray(r)) r=r[0]; const raws=r?.Resim? (Array.isArray(r.Resim)? r.Resim:[r.Resim]):[]; topImages=uniq(raws.map(text)); })(); /* ---- color/size extractor ---- */ function extractColorSize(sec){ let renk='',beden=''; let ek=sec?.EkSecenekOzellik; if(Array.isArray(ek)) ek=ek[0]; if(ek?.Ozellik){ (Array.isArray(ek.Ozellik)? ek.Ozellik:[ek.Ozellik]).forEach(o=>{ if(!o) return; let t='',d=''; if(o.$){t=o.$.Tanim||''; d=o.$.Deger||'';} else {t=o.Tanim||o['@Tanim']||''; d=o.Deger||o['@Deger']||'';} if(!d) d=o._||text(o); t=t.toLowerCase().trim(); d=d.trim(); if(t.includes('renk')) renk=d; else if(t.includes('beden')||t.includes('asorti')||t.includes('kişlik')) beden=d; }); } return {renk:renk||'Belirtilmedi', beden:beden||'STD'}; } /* ---- variant option list ---- */ const wrap=item.UrunSecenek; const optList=(()=>{ if(!wrap) return [{}]; const ws=Array.isArray(wrap)? wrap:[wrap]; return ws.flatMap(w=>{const s=w.Secenek; return Array.isArray(s)? s:(s?[s]:[]);}); })(); /* ---- build variants ---- */ const variants=optList.map((s,i)=>{ const {renk,beden}=extractColorSize(s); const qty=num(text(s.StokAdedi)); const price=(num(text(s.IndirimliFiyat))||num(text(s.SatisFiyati))).toFixed(2); const sku=text(s.StokKodu)||`${id}-${i+1}`; const barcode=text(s.Barkod); let imgs=[]; let rv=s.Resimler; if(Array.isArray(rv)) rv=rv[0]; if(rv?.Resim){const raw=Array.isArray(rv.Resim)? rv.Resim:[rv.Resim]; imgs=uniq(raw.map(text));} if(!imgs.length) imgs=topImages; return {renk,beden,qty,price,sku,barcode,images:imgs}; }); /* ---- Teknik detay listesi ---- */ let teknikList=[]; (()=>{ let td=item.TeknikDetaylar; if(Array.isArray(td)) td=td[0]; if(td?.TeknikDetay){ const lst=Array.isArray(td.TeknikDetay)? td.TeknikDetay:[td.TeknikDetay]; teknikList=lst .filter(t=> text(t.OzellikTanim).toLowerCase().trim() !== 'beden') // <— "Beden" satırlarını atla .map(t=>({n:text(t.OzellikTanim),v:text(t.DegerTanim)})) .filter(o=>o.n||o.v); } })(); /* ---- description html ---- */ const aciklama = text(item.Aciklama); let bodyHtml = aciklama; if(teknikList.length){ const li = teknikList.map(t=>`<li><strong>${t.n}:</strong> ${t.v}</li>`).join(''); bodyHtml += `<br/><h3>Teknik Detaylar</h3><ul>${li}</ul>`; } const seoDesc=strip(bodyHtml).slice(0,160); /* ---- handle ---- */ const handleBase=`${id}-${title}`; const handle = utils.toHandle? utils.toHandle(handleBase) : handleBase.toLowerCase().replace(/[^\wÀ-ÿ\s-]/g,'').replace(/\s+/g,'-').replace(/-+/g,'-').replace(/^-+|-+$/g,''); const PK=handle; /* ---- row template ---- */ const tpl=()=>({ '__PRODUCT_KEY':PK, Handle:handle, Title:title, 'Body (HTML)': '', Vendor:'', Type:'', Tags:'', Published:'TRUE', 'Option1 Name':'Beden', 'Option1 Value':'', 'Option2 Name':'Renk', 'Option2 Value':'', 'Variant SKU':'', 'Variant Barcode':'', 'Variant Inventory Qty':0, 'Variant Price':'0.00', 'Variant Image':'', 'Image Src':'', 'Image Position':'', 'Image Alt Text':'', 'SEO Title':'', 'SEO Description':'', Status:'active' }); /* ---- build csv rows ---- */ const rows=[]; let imgPos=1; variants.forEach((v,idx)=>{ const r=tpl(); if(idx===0){ r['Body (HTML)']=bodyHtml; r.Vendor=vendor; r.Type=type; r.Tags=tags; r['SEO Title']=title; r['SEO Description']=seoDesc; } r['Option1 Value']=v.beden; r['Option2 Value']=v.renk; r['Variant SKU']=v.sku; r['Variant Barcode']=v.barcode; r['Variant Inventory Qty']=v.qty; r['Variant Price']=v.price; if(v.images[0]){ r['Variant Image']=v.images[0]; r['Image Src']=v.images[0]; r['Image Position']=String(imgPos++); r['Image Alt Text']=`${title} ${v.renk} ${v.beden}`.trim(); } rows.push(r); v.images.slice(1).forEach(src=>{ const ir=tpl(); ir['Option1 Value']=v.beden; ir['Option2 Value']=v.renk; ir['Variant Image']=src; ir['Image Src']=src; ir['Image Position']=String(imgPos++); ir['Image Alt Text']=`${title} ${v.renk} ${v.beden}`.trim(); rows.push(ir); }); }); return rows; };
Güncelle
İptal
İstatistikler
Toplam Çalışma
4071
Başarı Oranı
94%
İşlenen Ürün
0
Push Edilen
0