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 convertDefileString(root, utils = {}) { // Eğer root bir string ise, doğrudan XML string'i üzerinde çalış let xmlString = ''; if (typeof root === 'string') { xmlString = root; } else { // Object'ten string'e çevir xmlString = JSON.stringify(root); } const products = extractProductsFromXML(xmlString); return products.flatMap(product => convertSingleProduct(product)); function extractProductsFromXML(xml) { const products = []; // <product>...</product> blokları bul const productRegex = /<product>([\s\S]*?)<\/product>/g; let match; while ((match = productRegex.exec(xml)) !== null) { const productXML = match[1]; // Her product için bilgileri çıkar const product = { id: extractValue(productXML, 'id'), name: extractValue(productXML, 'name'), description: extractValue(productXML, 'description'), brand: extractValue(productXML, 'brand'), cat1name: extractValue(productXML, 'cat1name'), cat2name: extractValue(productXML, 'cat2name'), category_path: extractValue(productXML, 'category_path'), stock: extractValue(productXML, 'stock'), price: extractValue(productXML, 'sellPrice'), metaTitle: extractValue(productXML, 'pageTitle'), metaDesc: extractValue(productXML, 'description'), tags: extractTags(productXML), variants: extractVariants(productXML), images: extractImages(productXML) }; products.push(product); } return products; } function extractValue(xml, tagName) { const regex = new RegExp(`<${tagName}[^>]*>([\\s\\S]*?)<\\/${tagName}>`, 'i'); const match = xml.match(regex); if (match) { return match[1].replace(/<!\[CDATA\[(.*?)\]\]>/g, '$1').trim(); } return ''; } function extractTags(xml) { const tags = []; const tagRegex = /<tag[^>]*>[\s\S]*?<name[^>]*>([^<]+)<\/name>[\s\S]*?<\/tag>/g; let match; while ((match = tagRegex.exec(xml)) !== null) { tags.push(match[1].trim()); } return tags; } function extractVariants(xml) { const variants = []; // <variant>...</variant> blokları bul const variantRegex = /<variant>([\s\S]*?)<\/variant>/g; let match; while ((match = variantRegex.exec(xml)) !== null) { const variantXML = match[1]; // Renk ve beden bilgilerini çıkar let color = ''; let size = ''; const variantValueRegex = /<variantValue>([\s\S]*?)<\/variantValue>/g; let vvMatch; while ((vvMatch = variantValueRegex.exec(variantXML)) !== null) { const vvXML = vvMatch[1]; const typeName = extractValue(vvXML, 'variantTypeName').toUpperCase(); const valueName = extractValue(vvXML, 'variantValueName'); if (typeName === 'RENK') color = valueName; if (typeName === 'BEDEN') size = valueName; } const variant = { id: extractValue(variantXML, 'id'), sku: extractValue(variantXML, 'sku'), color: color, size: size, price: extractValue(variantXML, 'sellPrice'), stock: extractValue(variantXML, 'stockCount'), barcode: extractValue(variantXML, 'barcodeList'), images: extractImages(variantXML) }; variants.push(variant); } return variants; } function extractImages(xml) { const images = []; // <image>...</image> blokları bul const imageRegex = /<image[^>]*>([\s\S]*?)<\/image>/g; let match; const imageData = []; while ((match = imageRegex.exec(xml)) !== null) { const imageXML = match[1]; const url = extractValue(imageXML, 'imageUrl'); const isMain = extractValue(imageXML, 'isMain') === 'true'; const order = parseInt(extractValue(imageXML, 'order') || '999', 10); if (url) { imageData.push({ url, isMain, order }); } } // isMain önce, sonra order'a göre sırala return imageData .sort((a, b) => { if (a.isMain && !b.isMain) return -1; if (!a.isMain && b.isMain) return 1; return a.order - b.order; }) .map(img => img.url); } function convertSingleProduct(product) { const slugify = str => String(str).toLowerCase() .replace(/[ğĞ]/g,'g').replace(/[üÜ]/g,'u') .replace(/[şŞ]/g,'s').replace(/[ıİ]/g,'i') .replace(/[öÖ]/g,'o').replace(/[çÇ]/g,'c') .replace(/[^a-z0-9]+/g,'-').replace(/^-+|-+$/g,''); const toPrice = v => { const n = Number(String(v || '').replace(',', '.')); return Number.isFinite(n) ? n.toFixed(2) : '0.00'; }; const uniq = arr => [...new Set(arr.filter(Boolean))]; // Temel bilgiler const productId = product.id.slice(-8) || 'NO-ID'; const title = product.name || 'Adsız Ürün'; const vendor = product.brand || 'DEFİLE_XML'; const type = product.cat2name || product.cat1name || ''; const tags = [product.cat1name, product.cat2name, ...product.tags].filter(Boolean).join(', '); const bodyHtml = product.description || ''; const seoTitle = product.metaTitle || title; const seoDesc = product.metaDesc || ''; // Varyantları işle let variants = []; if (product.variants.length > 0) { variants = product.variants.map(v => ({ color: v.color || 'Tek Renk', size: v.size || '', sku: v.sku || `${productId}-${v.color}-${v.size}`, barcode: v.barcode || '', qty: Math.min(Math.max(parseInt(v.stock || '0', 10), 0), 999), price: toPrice(v.price), images: v.images })); } else { variants = [{ color: 'Tek Renk', size: '', sku: productId, barcode: '', qty: Math.min(Math.max(parseInt(product.stock || '0', 10), 0), 999), price: toPrice(product.price), images: [] }]; } // CSV satırları oluştur const productHandle = slugify(`${productId}-${title}`); const rows = []; let imgPos = 1; const baseRow = () => ({ Handle: productHandle, Title: '', 'Body (HTML)': '', Vendor: '', Type: '', Tags: '', Published: 'TRUE', 'Option1 Name': 'Renk', 'Option1 Value': '', 'Option2 Name': variants.some(v => v.size) ? 'Beden' : '', 'Option2 Value': '', 'Option3 Name': '', 'Option3 Value': '', 'Variant SKU': '', 'Variant Grams': 200, 'Variant Inventory Tracker': 'shopify', 'Variant Inventory Qty': 0, 'Variant Inventory Policy': 'deny', 'Variant Fulfillment Service': 'manual', 'Variant Price': '0.00', 'Variant Compare At Price': '', 'Variant Requires Shipping': 'TRUE', 'Variant Taxable': 'TRUE', 'Variant Barcode': '', 'Image Src': '', 'Image Position': '', 'Image Alt Text': '', 'Gift Card': 'FALSE', 'SEO Title': seoTitle, 'SEO Description': seoDesc, 'Google Shopping / Google Product Category': '', 'Google Shopping / Gender': 'unisex', 'Google Shopping / Age Group': 'adult', 'Google Shopping / MPN': '', 'Google Shopping / AdWords Grouping': '', 'Google Shopping / AdWords Labels': '', 'Google Shopping / Condition': 'new', 'Google Shopping / Custom Product': '', 'Google Shopping / Custom Label 0': '', 'Google Shopping / Custom Label 1': '', 'Google Shopping / Custom Label 2': '', 'Google Shopping / Custom Label 3': '', 'Google Shopping / Custom Label 4': '', 'Variant Image': '', 'Variant Weight Unit': 'g', 'Variant Tax Code': '', 'Cost per item': '', Status: 'active' }); // Varyant satırları variants.forEach((variant, idx) => { const r = baseRow(); if (idx === 0) { r.Title = title; r['Body (HTML)'] = bodyHtml; r.Type = type; r.Tags = tags; r.Vendor = vendor; } r['Option1 Value'] = variant.color; r['Option2 Value'] = variant.size; r['Variant SKU'] = variant.sku; r['Variant Barcode'] = variant.barcode; r['Variant Inventory Qty'] = variant.qty; r['Variant Price'] = variant.price; const variantImg = variant.images[0] || product.images[0] || ''; if (variantImg) { r['Variant Image'] = variantImg; } if (idx === 0 && (variantImg || product.images[0])) { r['Image Src'] = variantImg || product.images[0]; r['Image Position'] = imgPos++; r['Image Alt Text'] = `${title} ${variant.color}`.trim(); } rows.push(r); }); // Ek görseller const allImages = uniq([ ...variants.flatMap(v => v.images), ...product.images ]); allImages.slice(1).forEach(src => { const r = baseRow(); r.Published = ''; r.Status = ''; r['Option1 Name'] = ''; r['Option1 Value'] = ''; r['Option2 Name'] = ''; r['Option2 Value'] = ''; r['Image Src'] = src; r['Image Position'] = imgPos++; r['Image Alt Text'] = title; rows.push(r); }); return rows; } };
Güncelle
İptal
İstatistikler
Toplam Çalışma
1368
Başarı Oranı
98%
İşlenen Ürün
0
Push Edilen
0