const generateCategoryJsonLd = (category, products = [], baseUrl, config) => { // Category IDs to skip (seeds, plants, headshop items) const skipCategoryIds = [689, 706, 709, 711, 714, 748, 749, 896, 710, 924, 923, 922, 921, 916, 278, 259, 258]; // Check if category ID is in skip list if (category.id && skipCategoryIds.includes(parseInt(category.id))) { return ''; } const categoryUrl = `${baseUrl}/Kategorie/${category.seoName}`; // Calculate price valid date (current date + 3 months) const priceValidDate = new Date(); priceValidDate.setMonth(priceValidDate.getMonth() + 3); const priceValidUntil = priceValidDate.toISOString().split("T")[0]; const jsonLd = { "@context": "https://schema.org/", "@type": "CollectionPage", name: category.name, url: categoryUrl, description: `${category.name} - Entdecken Sie unsere Auswahl an hochwertigen Produkten`, breadcrumb: { "@type": "BreadcrumbList", itemListElement: [ { "@type": "ListItem", position: 1, name: "Home", item: baseUrl, }, { "@type": "ListItem", position: 2, name: category.name, item: categoryUrl, }, ], }, }; // Add product list if products are available if (products && products.length > 0) { jsonLd.mainEntity = { "@type": "ItemList", numberOfItems: products.length, itemListElement: products.slice(0, 20).map((product, index) => ({ "@type": "ListItem", position: index + 1, item: { "@type": "Product", name: product.name, url: `${baseUrl}/Artikel/${product.seoName}`, image: product.pictureList && product.pictureList.trim() ? `${baseUrl}/assets/images/prod${product.pictureList .split(",")[0] .trim()}.jpg` : `${baseUrl}/assets/images/nopicture.jpg`, description: product.description ? product.description.replace(/<[^>]*>/g, "").substring(0, 200) : `${product.name} - Hochwertiges Growshop Produkt`, sku: product.articleNumber || product.seoName, brand: { "@type": "Brand", name: product.manufacturer || config.brandName, }, offers: { "@type": "Offer", url: `${baseUrl}/Artikel/${product.seoName}`, price: product.price && !isNaN(product.price) ? product.price.toString() : "0.00", priceCurrency: config.currency, priceValidUntil: priceValidUntil, availability: product.available ? "https://schema.org/InStock" : "https://schema.org/OutOfStock", seller: { "@type": "Organization", name: config.brandName, }, itemCondition: "https://schema.org/NewCondition", hasMerchantReturnPolicy: { "@type": "MerchantReturnPolicy", applicableCountry: "DE", returnPolicyCategory: "https://schema.org/MerchantReturnFiniteReturnWindow", merchantReturnDays: 14, returnMethod: "https://schema.org/ReturnByMail", returnFees: "https://schema.org/FreeReturn", }, shippingDetails: { "@type": "OfferShippingDetails", shippingRate: { "@type": "MonetaryAmount", value: 5.90, currency: "EUR", }, shippingDestination: { "@type": "DefinedRegion", addressCountry: "DE", }, deliveryTime: { "@type": "ShippingDeliveryTime", handlingTime: { "@type": "QuantitativeValue", minValue: 0, maxValue: 1, unitCode: "DAY", }, transitTime: { "@type": "QuantitativeValue", minValue: 2, maxValue: 3, unitCode: "DAY", }, }, }, }, }, })), }; } return ``; }; module.exports = { generateCategoryJsonLd, };