🤖 Shop Product AI - Claude Code Implementation

📋 Tüm işlemleri Claude Code yapacak | 📸 Sadece görseller Leonardo AI

SİSTEM KONTEKST

🏢 Multi-Tenant Laravel Sistemi

Parametre Değer
Tenant ID 2
Domain ixtif.com
Database tenant_ixtif
Sektör Endüstriyel Ekipman (Forklift, Transpalet)
Laravel Versiyonu 11.x
PHP Versiyonu 8.3

📊 Database Tables

shop_products → Ana ürün tablosu (PK: product_id) shop_categories → Kategori tablosu (PK: category_id) shop_brands → Marka tablosu (PK: brand_id) shop_product_variants → Variant ürünler media_library_items → Görsel yönetimi (Leonardo AI outputs)

🗄️ ShopProduct Model

Namespace: Modules\Shop\App\Models\ShopProduct Table: shop_products Primary Key: product_id (integer) Translatable Fields (Spatie/HasTranslations): - title (array: tr/en) - slug (array: tr/en) - body (array: tr/en) - short_description (array: tr/en) JSON Fields: - primary_specs (array) - faq_data (array) - tags (array) - technical_specs (array) - highlighted_features (array) Relations: - category (BelongsTo ShopCategory) - brand (BelongsTo ShopBrand) - variants (HasMany ShopProductVariant) - parent (BelongsTo ShopProduct, foreign: parent_product_id)

🗄️ ShopCategory Model

Namespace: Modules\Shop\App\Models\ShopCategory Table: shop_categories Primary Key: category_id (integer) Important Fields: - parent_id (integer, nullable) → Alt kategori ise parent category ID - title (array: tr/en) - slug (array: tr/en) Yedek Parça Kategorisi: category_id = 7 (parent_id IS NULL) Alt kategoriler: parent_id = 7

🤖 AI Rolleri

İşlem Kim Yapacak
İçerik üretimi (TR + EN) CLAUDE CODE (sen!)
Mevcut içerik analizi CLAUDE CODE
SEO keyword ekleme CLAUDE CODE
HTML üretimi CLAUDE CODE
Validation CLAUDE CODE
Database kayıt CLAUDE CODE
Görsel üretimi (2 adet) LEONARDO AI

GÖREV TANIMI

🎯 Ne Yapacaksın?

Yedek parça ürünleri için otomatik bilingual (TR+EN) içerik üreteceğin bir sistem oluşturacaksın.

✅ Hangi Ürünler İşlenecek?

  • Kategori: Sadece "Yedek Parça" (category_id = 7 VEYA parent category = 7)
  • Variant Durumu: Sadece ana ürünler (parent_product_id IS NULL veya 0)
  • Variant ürünler SKIP: Eğer parent_product_id > 0 ise işleme

🚫 Hangi Ürünler İŞLENMEZ?

  • ❌ Forklift kategorisi ürünleri
  • ❌ Transpalet kategorisi ürünleri
  • ❌ Variant ürünler (child products)
  • ❌ Diğer kategoriler

⚡ İki Farklı Strateji

Ürün içeriği mevcut durumuna göre iki farklı akışa girecek:

Durum Strateji Ne Yapılacak?
Branch A
Mevcut içerik VAR
EXPAND (Genişlet) • Mevcut teknik detayları koru
• İçeriği genişlet
• SEO ekle
Branch B
Mevcut içerik YOK
CREATE (Genel Oluştur) • Genel tanıtım yap
• Teknik detay VERME
• Güvenli içerik

AKIŞ DİYAGRAMI

BAŞLANGIÇ: Kullanıcı "product_id: 331 için içerik üret" der
1. ÜRÜN FİLTRELEME (Tenant başlat + Kontrol)
// Tenant başlat $tenant = \App\Models\Tenant::find(2); tenancy()->initialize($tenant); // Ürün getir $product = ShopProduct::find($productId); // Kontrol 1: Yedek parça mı? if ($product->category_id != 7 && $product->category->parent_id != 7) { throw new Exception('Bu ürün yedek parça kategorisinde değil'); } // Kontrol 2: Variant ürün mü? if ($product->parent_product_id && $product->parent_product_id > 0) { throw new Exception('Variant ürünler işlenmez, sadece ana ürünler'); }
2. MEVCUT İÇERİK KONTROLÜ (KRİTİK!)
$existingBody = $product->body['tr'] ?? ''; $hasContent = strlen($existingBody) > 100; if ($hasContent) { // BRANCH A → Genişlet echo "✅ Mevcut içerik bulundu, genişletme modunda devam..."; $strategy = 'expand'; } else { // BRANCH B → Yeni oluştur echo "⚠️ Mevcut içerik yok, genel tanıtım oluşturulacak..."; $strategy = 'create'; }

🟢 BRANCH A - Mevcut İçerik Varsa

A1. Mevcut veriyi analiz et (Claude Code)
// Mevcut içeriği oku $existingBody = $product->body['tr']; $existingSpecs = $product->primary_specs ?? []; $existingFaq = $product->faq_data ?? []; // Teknik detayları regex ile çıkar preg_match_all('/(\d+\s*(mm|cm|kg|g|V|volt|A))/i', $existingBody, $techMatches); $technicalDetails = $techMatches[0] ?? []; echo "📊 Mevcut teknik detaylar: " . implode(', ', $technicalDetails);
A2. İçerik Üretimi (Claude Code sen yapacaksın!)
// Kullanıcı Claude Code'a şunu söyleyecek: "Bu ürün içeriğini genişlet: ÜRÜN: {$product->title['tr']} KATEGORİ: Yedek Parça MEVCUT İÇERİK: {$existingBody} MEVCUT TEKNİK DETAYLAR: {$technicalDetails} KURALLAR: ✅ Mevcut teknik detayları KORU (boyut, ağırlık, malzeme vb) ✅ İçeriği genişlet, daha detaylı yaz ✅ SEO keywords ekle: forklift, yedek parça, onarım, servis, montaj ✅ Pattern v4 HTML kullan ❌ Fiyat BİLGİSİ ASLA verme! ✅ Bilingual: TR + EN JSON FORMAT: { \"title\": {\"tr\": \"...\", \"en\": \"...\"}, \"short_description\": {\"tr\": \"...\", \"en\": \"...\"}, \"primary_specs\": [ {\"label\": \"Malzeme\", \"value\": \"Döküm Çelik\"} ], \"body\": { \"tr\": \"
...
\", \"en\": \"
...
\" }, \"faq_data\": [ {\"question\": \"...\", \"answer\": \"...\"} ], \"tags\": [\"forklift\", \"yedek parça\"] }" // Claude Code bu prompt'a cevap verecek!

🔴 BRANCH B - Mevcut İçerik Yoksa

B1. Sadece başlık + kategori al
$basicInfo = [ 'title' => $product->title, 'category' => 'Yedek Parça', ]; echo "⚠️ Sadece başlık bilgisi var, genel içerik üretilecek...";
B2. İçerik Üretimi (Claude Code sen yapacaksın!)
// Kullanıcı Claude Code'a şunu söyleyecek: "Bu ürün için GENEL tanıtım içeriği oluştur: ÜRÜN: {$product->title['tr']} KATEGORİ: Yedek Parça ⚠️ KRİTİK KURALLAR: ❌ Spesifik boyut/ağırlık/voltaj VERME (150mm, 2kg, 220V gibi) ❌ Fiyat bilgisi ASLA verme! ❌ Kesin teknik detay verme ✅ Genel ifadeler kullan: 'Detaylar için arayın', 'Forklift modelinize uyumlu', 'Profesyonel montaj önerilir' ✅ Kalite, güvenilirlik, OEM standartları vurgula ✅ SEO keywords: forklift, yedek parça, onarım, servis ✅ Pattern v4 HTML kullan ✅ Bilingual: TR + EN JSON FORMAT: (yukarıdaki gibi)" // Claude Code bu prompt'a cevap verecek!
3. VALIDATION (Claude Code kontrol eder)
// Fiyat kontrolü (HER ZAMAN) if (preg_match('/\d+\s*(TL|USD|\$|€|lira|dolar)/i', json_encode($content))) { throw new Exception('❌ İçerikte fiyat bilgisi var! Düzelt!'); } // Branch B için teknik detay kontrolü if ($strategy === 'create') { if (preg_match('/\d+\s*(mm|cm|kg|g|volt|V|A)/i', json_encode($content))) { throw new Exception('❌ Yeni içerikte teknik detay olmamalı! Düzelt!'); } } echo "✅ Validation passed!";
4. LEONARDO AI GÖRSELLER (2 adet)
// Leonardo AI Service kullan $leonardoService = app(\App\Services\Media\LeonardoAIService::class); // Foto 1: Kullanım ortamı $prompt1 = "Industrial workshop scene, forklift spare part installation, mechanic hands assembling parts, professional lighting, realistic photo"; $image1 = $leonardoService->generateFromPrompt($prompt1, [ 'width' => 1024, 'height' => 1024, 'style' => 'cinematic' ]); // Foto 2: Teknik çizim $prompt2 = "Technical blueprint drawing, forklift axle component diagram, engineering schematic, white background, clean lines"; $image2 = $leonardoService->generateFromPrompt($prompt2, [ 'width' => 1024, 'height' => 1024, 'style' => 'cinematic' ]); echo "📸 Görseller üretildi!";
5. GÖRSELLER EMBED + SEO TAGS (Claude Code)
// Body içine görselleri embed et $imageTag1 = "<a href='{$image1['url']}' class='glightbox block rounded-xl overflow-hidden border-2 border-gray-200 dark:border-gray-700 hover:border-blue-500 transition-all'> <img src='{$image1['url']}' alt='Forklift {$product->title['tr']} Yedek Parça Montaj Görseli' title='{$product->title['tr']} - OEM Kalite Forklift Yedek Parça' loading='lazy' class='w-full aspect-square rounded-xl object-cover'> </a>"; // Body içinde uygun yere yerleştir
6. SEO AYARLARI (Claude Code - KRİTİK!)
// SEO meta bilgileri üret (HasSeo trait kullanıyor) $seo = $product->getOrCreateSeoSetting(); $seo->update([ 'titles' => [ 'tr' => "Forklift {$product->title['tr']} | OEM Kalite Yedek Parça", 'en' => "Forklift {$product->title['en']} | OEM Quality Spare Part" ], 'descriptions' => [ 'tr' => "Forklift {$product->title['tr']} yedek parçası. OEM kalite, hızlı teslimat. Detaylı bilgi ve fiyat için iletişime geçin.", 'en' => "Forklift {$product->title['en']} spare part. OEM quality, fast delivery. Contact for details and pricing." ], 'keywords' => [ 'tr' => implode(', ', $aiContent['tags']), 'en' => implode(', ', array_map(fn($tag) => translateToEn($tag), $aiContent['tags'])) ], 'og_titles' => [ 'tr' => $product->title['tr'], 'en' => $product->title['en'] ], 'og_descriptions' => [ 'tr' => $product->short_description['tr'], 'en' => $product->short_description['en'] ], 'focus_keywords' => [ 'tr' => ['forklift', 'yedek parça', $product->title['tr']], 'en' => ['forklift', 'spare part', $product->title['en']] ], 'schema_type' => ['Product'], 'robots_meta' => ['index', 'follow'], ]); echo "✅ SEO ayarları kaydedildi!";
7. DATABASE SAVE (Claude Code)
$product->update([ 'title' => $aiContent['title'], 'short_description' => $aiContent['short_description'], 'body' => $aiContent['body'], 'primary_specs' => $aiContent['primary_specs'], 'faq_data' => $aiContent['faq_data'], 'tags' => $aiContent['tags'], ]); // Cache clear Artisan::call('view:clear'); Artisan::call('responsecache:clear'); exec('curl -s -k https://ixtif.com/opcache-reset.php'); echo "✅ İçerik kaydedildi ve cache temizlendi!";

KRİTİK KURALLAR

🚨 KURAL 1: FİYAT BİLGİSİ ASLA

Hiçbir durumda fiyat bilgisi verilmeyecek:

  • ❌ "500 TL", "1000 $", "100-500 TL arası"
  • ❌ "Ucuz", "Uygun fiyat", "Ekonomik"
  • ✅ "Fiyat için arayın"
  • ✅ "Güncel fiyat bilgisi için iletişime geçin"

🚨 KURAL 2: TEKNİK DETAY (Koşullu)

Durum Teknik Detay
Branch A (Mevcut VAR) ✅ KULLAN - Mevcut teknik detayları koruyup genişlet
Branch B (Mevcut YOK) ❌ VERME - Spesifik boyut/ağırlık/voltaj belirtme

🚨 KURAL 3: GOOGLE SEO ÖNCELİKLİ

  • ✅ Long-tail keywords: "forklift arka dingil yedek parça"
  • ✅ LSI keywords: bakım, onarım, servis, montaj, değişim
  • ✅ FAQ = Google arama sorguları formatında
  • ✅ Alt/title tags görsellerde

🚨 KURAL 4: GÖRSEL STRATEJİSİ

  • ❌ Ürünü birebir oluşturma (AI hallucination riski!)
  • ✅ Foto 1: Kullanım ortamı (atölye, montaj sahnesi)
  • ✅ Foto 2: Sallantılı teknik çizim (blueprint style)
  • ✅ 1024x1024 square format
  • ✅ Cinematic veya realistic style

PATTERN V4 HTML YAPISI

📐 HTML Şablonu (Claude Code bu formatı kullanacak)

<!-- GİRİŞ BÖLÜMÜ --> <section class='mb-20'> <div class='grid md:grid-cols-2 gap-8 mb-12'> <!-- Sol: Açıklama --> <div> <p class='text-gray-700 dark:text-gray-300 mb-6'> [Ürün açıklaması, 2-3 paragraf] </p> </div> <!-- Sağ: Görsel 1 --> <a href='{imageUrl}' class='glightbox block rounded-xl overflow-hidden border-2 border-gray-200 dark:border-gray-700 hover:border-blue-500 transition-all'> <img src='{imageUrl}' alt='Forklift [Ürün Adı] Yedek Parça' title='[Ürün Adı] - OEM Kalite' loading='lazy' class='w-full aspect-square rounded-xl object-cover'> </a> </div> </section> <!-- NEDEN TERCİH ETMELİSİNİZ --> <section class='mb-20'> <h2 class='text-3xl font-bold mb-12 text-gray-900 dark:text-white'> Neden Bu Yedek Parçayı Tercih Etmelisiniz? </h2> <div class='grid md:grid-cols-3 gap-8'> <!-- Kart 1 --> <div class='text-center p-6 bg-gray-50 dark:bg-gray-800 rounded-xl'> <i class='fas fa-check-circle text-5xl text-blue-600 mb-4'></i> <h3 class='text-xl font-bold mb-3 text-gray-900 dark:text-white'> OEM Kalite </h3> <p class='text-gray-700 dark:text-gray-300'> Orijinal ekipman kalitesinde... </p> </div> <!-- Kart 2, 3... --> </div> </section> <!-- GÖRSEL 2 + DETAY --> <section class='mb-20'> <div class='grid md:grid-cols-2 gap-8'> <a href='{image2Url}' class='glightbox'>...</a> <div>[Detaylı açıklama]</div> </div> </section>

SQL SORGULARI

Yedek Parça Ana Ürünlerini Bul

-- Tenant database seç USE tenant_ixtif; -- Yedek parça kategorisindeki ana ürünler SELECT p.product_id, p.title, p.category_id, c.title AS category_title, LENGTH(JSON_EXTRACT(p.body, '$.tr')) AS content_length, CASE WHEN LENGTH(JSON_EXTRACT(p.body, '$.tr')) > 100 THEN 'Branch A (Genişlet)' ELSE 'Branch B (Yeni Oluştur)' END AS strategy FROM shop_products p JOIN shop_categories c ON p.category_id = c.category_id WHERE (p.category_id = 7 OR c.parent_id = 7) AND (p.parent_product_id IS NULL OR p.parent_product_id = 0) ORDER BY strategy, p.product_id;

İstatistikler

-- Branch A: Mevcut içeriği olanlar SELECT COUNT(*) AS branch_a_count FROM shop_products p WHERE (p.category_id = 7 OR EXISTS( SELECT 1 FROM shop_categories c WHERE c.category_id = p.category_id AND c.parent_id = 7 )) AND (p.parent_product_id IS NULL OR p.parent_product_id = 0) AND LENGTH(JSON_EXTRACT(p.body, '$.tr')) > 100; -- Branch B: Mevcut içeriği olmayanlar SELECT COUNT(*) AS branch_b_count FROM shop_products p WHERE (p.category_id = 7 OR EXISTS( SELECT 1 FROM shop_categories c WHERE c.category_id = p.category_id AND c.parent_id = 7 )) AND (p.parent_product_id IS NULL OR p.parent_product_id = 0) AND (p.body IS NULL OR LENGTH(JSON_EXTRACT(p.body, '$.tr')) <= 100);

ÖRNEK KULLANIM

💬 Kullanıcı Örnek Talebi

Kullanıcı: "product_id: 331 için içerik üret"

🤖 Claude Code İşlem Adımları

  1. Tenant başlat: Tenant 2 (ixtif.com) aktif et
  2. Ürün getir: ShopProduct::find(331)
  3. Filtreleme: Yedek parça mı? Variant değil mi?
  4. Strateji belirle: Mevcut içerik var mı? (Branch A/B)
  5. İçerik üret: Sen (Claude Code) prompt'a göre içerik üret
  6. Validation: Fiyat var mı? Teknik detay (Branch B ise) var mı?
  7. Leonardo AI: 2 görsel üret (1024x1024)
  8. Embed görseller: Body içine SEO taglerle yerleştir
  9. SEO ayarları: updateSeo() ile meta title/description/keywords/og tags (KRİTİK!)
  10. Save: Database'e kaydet + cache temizle
  11. Doğrula: URL'yi test et (https://ixtif.com/shop/...)

BAŞARI KRİTERLERİ

✅ Sistem Başarılı Sayılır Eğer:

  1. Sadece yedek parça kategorisi işleniyor
  2. Variant ürünler otomatik reject ediliyor
  3. Mevcut içerik varsa (Branch A) teknik detaylar KORUNUYOR
  4. Mevcut içerik yoksa (Branch B) genel tanıtım yapılıyor
  5. HİÇBİR ÜRÜNDE fiyat bilgisi YOK
  6. Branch B ürünlerinde spesifik teknik detay YOK
  7. SEO keywords her üründe mevcut
  8. Leonardo AI görselleri context sağlıyor (exact product değil)
  9. GLightbox + SEO tags çalışıyor
  10. Validation tüm kurallara uyuyor

🔴 KRİTİK GÖRSEL YÖNETİMİ KURALLARI

⚠️ ASLA LEONARDO AI CDN LİNKLERİ KULLANMA!

YANLIŞ:

❌ https://cdn.leonardo.ai/users/52776fa4.../image.jpg

DOĞRU:

✅ https://ixtif.com/storage/tenant2/987/akson-kece-kapagi-422-workshop.jpg

Neden?

  • Leonardo AI linkleri harici CDN (dışa bağımlılık)
  • Görseller sisteme ait değil, silinebilir
  • SEO ve performans sorunları
  • Media yönetimi takip edilemez

📸 Görsel Yükleme Workflow (ZORUNLU)

  1. Görsel Oluştur: Leonardo AI / Placeholder / Stock photo
  2. Sisteme Yükle: Spatie Media Library kullan
    $product->addMedia("/tmp/image.jpg") ->usingName("Açıklayıcı İsim") ->usingFileName("seo-friendly-name.jpg") ->withCustomProperties([ "alt" => "SEO alt text", "title" => "SEO title" ]) ->toMediaCollection("gallery");
  3. Media Tablosuna Kaydet: Otomatik kaydedilir (media ID alınır)
  4. ixtif.com Linki Al:
    $media->getFullUrl(); // https://ixtif.com/storage/tenant2/987/akson-kece-kapagi-422-workshop.jpg
  5. Body HTML Güncelle: Placeholder URL'lerini gerçek linklerle değiştir

HTML YAPISI KRİTİK STANDARTLAR

⚡ Primary Specs Format (KRİTİK!)

YANLIŞ (String Array):

❌ $product->primary_specs = [ "tr" => ["OEM Kalite", "Yüksek Dayanıklılık"] ];

DOĞRU (Label/Value Pairs):

✅ $product->primary_specs = [ ["label" => "Malzeme", "value" => "Yüksek Kalite Keçe"], ["label" => "Uyumluluk", "value" => "Forklift Dingil Sistemleri"], ["label" => "Seri", "value" => "422"] ];

📏 Minimum İçerik Gereksinimleri

Özellik Minimum
Body Length (TR) 10,000 karakter
Ana Bölüm Sayısı 6 section
Feature Kartları 3 kart (grid 3 sütun)
FAQ 5 soru-cevap (bilingual)
Görseller 2 görsel (media tablosunda)

🖼️ Sticky Sidebar Image Pattern (Zorunlu)

<section class="intro-section mb-20"> <div class="grid grid-cols-1 lg:grid-cols-3 gap-8"> <div class="lg:col-span-2"> <!-- 3 paragraf açıklama --> </div> <div class="lg:col-span-1"> <div class="sticky top-24"> <a href="[ixtif.com IMAGE]" class="glightbox"> <img src="[ixtif.com IMAGE]" alt="..." /> </a> </div> </div> </div> </section>

GÜNCEL BAŞARI KRİTERLERİ (2025-11-28 Revize)

✅ Sistem Başarılı Sayılır Eğer:

  1. Sadece yedek parça kategorisi işleniyor
  2. Variant ürünler otomatik reject ediliyor
  3. Mevcut içerik varsa (Branch A) teknik detaylar KORUNUYOR
  4. Mevcut içerik yoksa (Branch B) genel tanıtım yapılıyor
  5. HİÇBİR ÜRÜNDE fiyat bilgisi YOK
  6. Branch B ürünlerinde spesifik teknik detay YOK
  7. 🔴 YENİ: Görseller ixtif.com/storage/tenant2/... üzerinden (Leonardo CDN DEĞİL!)
  8. 🔴 YENİ: Media tablosunda kayıt VAR (Spatie Media Library)
  9. 🔴 YENİ: Primary specs label/value pairs formatında
  10. 🔴 YENİ: Body length minimum 10,000 karakter
  11. 🔴 YENİ: Sticky sidebar image kullanılıyor
  12. 🔴 YENİ: 3 sütun feature grid mevcut
  13. SEO keywords her üründe mevcut
  14. GLightbox + SEO tags çalışıyor
  15. Validation tüm kurallara uyuyor

❌ Sistem Başarısız Sayılır Eğer:

  1. Leonardo AI CDN linkleri kullanılıyorsa
  2. Görseller media tablosunda yoksa
  3. Primary specs string array formatındaysa
  4. Body length 10,000 karakterden azsa
  5. Sticky sidebar image yoksa
  6. Feature grid 3 sütun değilse
  7. Fiyat bilgisi varsa
  8. Branch B'de spesifik teknik detay varsa