📊 Blog İçeriğinde Dinamik Ürün Enjeksiyonu

📅 Tarih: 2025-11-19 | 🎯 Tenant: ixtif.com (Tenant 2) | 👤 Talep: Blog yazılarına otomatik ürün kartları enjekte et

🔍 Mevcut Sistem Analizi

1. Blog Modülü Yapısı

Blog Model (Modules/Blog/app/Models/Blog.php)

  • Primary Key: blog_id
  • Çoklu Dil: HasTranslations trait (title, slug, body, excerpt JSON kolonlar)
  • İçerik Alanı: body (array/JSON - her dil için HTML içerik)
  • İlişkiler: BlogCategory, Tags, MediaLibrary
  • Özel Alanlar: faq_data, howto_data (JSON)
  • Review System: HasReviews trait mevcut

Blog Detay Sayfası (show-content.blade.php)

  • Content Render: Satır 364-395 arası prose class ile
  • Widget Shortcode: parse_widget_shortcodes() fonksiyonu mevcut (satır 389)
  • Image Processing: process_blog_images() ile Thumbmaker optimizasyonu (satır 392)
  • H2 Heading Yapısı: TocService ile anchor oluşturuluyor (satır 11)

2. Shop Modülü Yapısı

ShopProduct Model (Modules/Shop/app/Models/ShopProduct.php)

  • Primary Key: product_id
  • MeiliSearch: Laravel Scout + Searchable trait mevcut ✅
  • is_homepage Flag: show_on_homepage kolonu mevcut (satır 78)
  • Homepage Sort: homepage_sort_order kolonu mevcut (satır 79)
  • Kategori İlişkisi: belongsTo ShopCategory (category_id)
  • Tag Sistemi: tags (JSON array) - satır 86
  • Scout toSearchableArray(): Satır 185-232 arası zengin indexing
⚠️ Kritik Bulgu: ShopProduct modelinde show_on_homepage ve homepage_sort_order kolonları zaten mevcut! Ek kolon eklemeye gerek yok.

🎯 Önerilen Strateji: 3 Yöntem

🎯
Yöntem 1: MeiliSearch ile Akıllı Eşleştirme

Nasıl Çalışır:

  • Blog başlığından ve içeriğinden anahtar kelimeleri çıkar
  • MeiliSearch'e bu kelimelerle sor
  • İlgili ürünleri is_homepage=1 olanlardan filtrele

Avantajlar:

  • ✅ Otomatik içerik eşleştirme
  • ✅ Hızlı (MeiliSearch RAM-based)
  • ✅ Ek kolon gereksiz

Dezavantajlar:

  • ❌ Her zaman doğru eşleşmeyebilir
Öncelik: Yüksek
🏷️
Yöntem 2: Tag-Based Eşleştirme

Nasıl Çalışır:

  • Blog ve ürünlerde ortak tag sistemi kullan
  • Örnek: transpalet tag'i hem blogda hem üründe
  • Tag eşleşmesine göre ürün göster

Avantajlar:

  • ✅ Kesin kontrol (admin belirler)
  • ✅ Basit SQL JOIN

Dezavantajlar:

  • ❌ Manuel yönetim gerekir
  • ❌ Tag sistemi Blog ve Shop arasında senkron olmalı
Öncelik: Orta
📋
Yöntem 3: Manuel Product ID Atama

Nasıl Çalışır:

  • Blog admin paneline İlgili Ürünler seçici ekle
  • Admin hangi ürünlerin gösterileceğini manuel seçer

Avantajlar:

  • ✅ 100% kontrol

Dezavantajlar:

  • ❌ Ek kolon gerekir (related_product_ids JSON)
  • ❌ Her blog için manuel atama
  • ❌ CLAUDE.md kuralına göre: Ek tablo/kolon olmazsa daha iyi
Öncelik: Düşük

✅ Önerilen Çözüm: Hybrid Yaklaşım

🎯 Ana Strateji: MeiliSearch + Tag-Based Fallback (Yöntem 1 + 2 kombinasyonu)

Mantık Akışı

Adım 1: Blog İçeriğinden Anahtar Kelime Çıkar

Blog başlığı ve body HTML'inden stop-word olmayan önemli kelimeleri çıkar. Örneğin:

  • Başlık: "Transpalet Seçerken Dikkat Edilmesi Gerekenler"
  • Çıkan Kelimeler: "transpalet", "seçerken", "dikkat", "gerekenler"

Adım 2: MeiliSearch ile İlgili Ürünleri Bul

Bu anahtar kelimelerle MeiliSearch'te ara. Filtreleme kriterleri:

  • show_on_homepage = 1 (anasayfada gösterilebilecek ürünler)
  • is_active = 1 (aktif ürünler)
  • Sıralama: homepage_sort_order ASC

Adım 3: Fallback - Tag Eşleştirme

Eğer MeiliSearch yeterli ürün döndürmezse (örn. 3'ten az):

  • Blog tag_list ile ShopProduct tags JSON match yap
  • Eksik ürünleri tamamla

Adım 4: H2 Başlıklarına Ürün Enjekte Et

Blog body HTML'ini parse et ve şu konumlara ürün kartları ekle:

  • 2. H2 başlığı öncesi: İlk 3 ürün
  • Sondan 1. H2 başlığı öncesi: Son 3 ürün

⚡ Performans Stratejisi

1. Cache Yönetimi

  • Blog Bazlı Cache: Her blog için ilgili ürünleri 1 saat cache'le
  • Cache Key: blog_products_{blog_id}_{locale}
  • Invalidation: Ürün show_on_homepage değiştiğinde tüm blog cache'lerini temizle

2. MeiliSearch Optimizasyonu

  • ShopProduct::toSearchableArray() zaten optimized
  • Filtreleme: show_on_homepage, is_active indexte mevcut
  • Sıralama: homepage_sort_order kullanılabilir
⚠️ Dikkat: Blog render sırasında gerçek zamanlı HTML parse yapılacak. Eğer çok yavaş olursa Observer pattern'e geç:
  • BlogObserver::saved() eventinde body'yi parse et
  • Sonucu processed_body kolonuna kaydet
  • Ancak bu ek kolon gerektirir (CLAUDE.md kuralına aykırı)

🌍 Multi-Tenant Uyumluluk

Tenant-Specific Behavior

Tenant Sektör Davranış
Tenant 2 (ixtif.com) Endüstriyel Ekipman Aktif: Transpalet/Forklift yazılarında ilgili ürünler
Tenant 1001 (muzibu.com) Müzik Platformu Farklı Strateji: Müzik aletleri, kurslar vb.
Diğer Tenant'lar Çeşitli Aynı sistem, farklı ürün kategorileri

Implementasyon:

  • Helper fonksiyonlar global (tüm tenant'lar için)
  • MeiliSearch tenant-aware (zaten mevcut)
  • Ürün filtreleme tenant database'inden yapılıyor

📝 Uygulama Yapılacaklar Listesi

Adım 1: Helper Fonksiyonlar Yüksek Öncelik

Konum: app/Helpers/blog_product_injector.php (yeni)

  • extractKeywordsFromBlog() fonksiyonu yaz (blog title + body'den anahtar kelime çıkar)
  • getRelatedProductsForBlog() fonksiyonu yaz (MeiliSearch + Tag fallback)

Beklenen Sonuç: Blog objesi gir → İlgili 3-6 ürün dön

Adım 2: Content Injector Service Yüksek Öncelik

Konum: app/Services/BlogContentInjectorService.php (yeni)

  • injectProducts() metodu: H2 taglerini bul ve ürün enjekte et
  • DOMDocument ile HTML parse et (güvenli & performanslı)
  • Blade component render: product-grid-inline

Beklenen Sonuç: HTML gir → Ürün kartları eklenmiş HTML dön

Adım 3: Blade Component Orta Öncelik

Konum: resources/views/components/shop/product-grid-inline.blade.php (yeni)

  • Tasarım: Blog içinde gözükmeyecek kadar göze batan olmasın
  • Tailwind CSS kullan (mevcut blog tasarımına uyumlu)
  • Responsive grid (mobilde 1, tablette 2, masaüstünde 3 sütun)
  • Lazy loading görsel
  • CTA: Ürünü İncele butonu

Beklenen Sonuç: 3 ürünlük kompakt grid

Adım 4: show-content.blade.php Entegrasyonu Orta Öncelik

Konum: Modules/Blog/resources/views/themes/ixtif/partials/show-content.blade.php

  • Satır 389 civarı BlogContentInjectorService::injectProducts() çağrısı ekle
  • Cache implementasyonu ekle

Beklenen Sonuç: Blog detay sayfasında ürünler otomatik gösterilir

Adım 5: Test & Optimizasyon Düşük Öncelik

  • 5-10 blog yazısı ile test et
  • Performans ölç (HTML parse süresi)
  • Cache hit rate kontrol et
  • Mobile responsive kontrol et

💡 Geliştiriciye Notlar

Dikkat Edilmesi Gerekenler:
  • ❗ Blog body içeriği zaten widget shortcode parse ediliyor - bu parse SONRASINA ürün enjekte et
  • ❗ H2 tag sayısı az olan bloglarda (0-1 adet) ürün gösterme - UX kötü olur
  • ❗ MeiliSearch boş döndüğünde fallback stratejisi olsun (random homepage products)
  • ❗ Ürün kartlarında lazy loading kullan (blog sayfası ağırlaşmasın)
  • ❗ show_on_homepage=1 olan ürünler bitmişse gösterme (boş kart gösterme)
✅ Avantajlar:
  • Ek database kolonu yok (CLAUDE.md kuralına uygun)
  • Otomatik içerik eşleştirme (manuel yönetim minimum)
  • MeiliSearch sayesinde hızlı
  • Multi-tenant uyumlu
  • Blog AI generate sistemi ile birlikte çalışır