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!";