📊 Blog Modülü & Meilisearch Entegrasyonu

📅 Tarih: 2025-12-02
🎯 Tenant: İxtif (2), Muzibu (1001)
👤 Detaylı Analiz: 5 Ana Sistem

🎯 Sistem Genel Bakışı

Blog modülü, AI ile otomatik blog taslağı ve içerik üretimi, Meilisearch entegrasyonu, ürün injeksiyonu ve InstantPage preloading'i içeren kapsamlı bir sistemdir. Her bileşen tenant-aware ve SEO-optimize edilmiştir.

AI Content Generation SEO Optimized InstantPage Search Analytics

🤖 AI Draft Generator

25+ blog taslağını otomatik olarak oluşturur. OpenAI GPT-4o-mini kullanır. Kategori önerisi, SEO anahtar kelimeleri ve ana hatlar dahil.

✍️ AI Content Writer

2000+ kelime, 4-5 H2, 10 FAQ, 7-step HowTo. Leonardo AI ile AI görsel üretim. 3 farklı yazım stili (Profesyonel, Samimi, Uzman).

📦 Product Injector

Blog içerisine ürün kartları ve CTA bannerları dinamik enjekte eder. Tag/Title/Excerpt tabanlı eşleştirme. 6 tema, animasyonlu tasarım.

🔍 Meilisearch Analytics

Arama sorgularını kaydeder, popüler aramaları izler. SEO ve içerik geliştirme için veri sağlar. Zero-result aramaları tespit eder.

⚡ InstantPage

Mouseover, touch, viewport ile link preloading. Sayfa hızını artırır. FetchPriority API ile optimize edilmiş.

📊 Universal Schemas

BlogPosting, FAQPage, HowToSchema otomatik üretimi. BreadcrumbList, ItemList desteği. SEO ve structured data tanımlı.

🤖 1. Blog AI Draft Generator

Genel Fonksiyon

Model: BlogAIDraft (Taslak yönetimi)

Service: BlogAIDraftGenerator (Üretim motoru)

OpenAI API ile 25+ blog taslağını toplu olarak oluşturur. Her taslak 4-5 h2 başlığı, kategori önerisi, SEO anahtar kelimeleri ve meta description içerir.

İş Akışı

1

Duplicate Kontrolü

Mevcut blog başlıkları ve taslaklar taranır. Tekrar eden başlıklar engellenir.

2

Tenant Context Hazırlama

Firma adı, sektör, hedef kitle, anahtar kelimeler, mevcut kategoriler AI'ya sunulur.

3

AI İstemi Oluşturma

GPT-4o-mini modeline system message + user prompt gönderilir. max_tokens: 25 * 250 = 6250.

4

JSON Parsing

Response markdown code block'larından çıkarılır. Array'e çevrilir. Format normalizasyonu yapılır.

5

Database Kayıt

Taslaklar blog_ai_drafts tablosuna kaydedilir. is_selected=false, is_generated=false ile başlar.

6

Credit Düşme

1.0 credit düşülür. Blog AI limiti kontrol edilir (günlük/aylık).

Model Yapısı (BlogAIDraft)

Alan Tür Açıklama
topic_keyword string Blog başlığı / konusu
category_suggestions array [1, 5, 3] Önerilen kategori ID'leri
seo_keywords array SEO için hedef anahtar kelimeler
outline array H2 başlıkları (4-5 tane)
meta_description string|null SEO meta description (max 155 char)
is_selected boolean Admin tarafından seçildi mi?
is_generated boolean Blog yazısı mı oluşturuldu?
generated_blog_id int|null Oluşturulan blog ID'si

Scope Metotları

BlogAIDraft::selected() // is_selected=true BlogAIDraft::unselected() // is_selected=false BlogAIDraft::pending() // selected + not generated BlogAIDraft::generated() // is_generated=true

Önemli Notlar

Credit Yönetimi: Her taslak batch'i 1.0 credit harcar. Setting'ten blog_ai_monthly_draft_limit kontrol edilir (varsayılan: 10 batch/ay).
Duplicate Prevention: Mevcut blog başlıkları + taslak konuları kontrol edilir. Tekrar eden başlık hata fırlatır.

✍️ 2. Blog AI Content Writer

Genel Fonksiyon

Seçilmiş taslakları tam blog yazısına dönüştürür. 2000+ kelime garantisi. Iterative approach kullanır:

  1. Outline oluştur (4-5 H2)
  2. Her H2 için 500-600 kelime detaylı içerik (3-4 H3 alt başlık)
  3. 10 maddeli FAQ üret
  4. 7 adımlı HowTo schema üret
  5. Featured image (Leonardo AI)

Yazım Stilleri (Random veya Setting Kontrollü)

Stil Açıklama Örnekler
Profesyonel Kurumsal, resmi, teknik, B2B uygun "Endüstriyel ekipman seçiminde dikkate alınması gereken kriterler..."
Samimi Dostça, doğal, B2C uygun (opsiyonel) "Forklift seçerken kafanız mı karıştı? Birlikte bakalım!"
Uzman Derinlemesine teknik, akademik, detaylı "AC motor tork karakteristikleri, yük profillerine göre optimize..."
Setting: blog_ai_professional_only = 1 ise sadece Profesyonel + Uzman, Samimi disabled.

İçerik Üretim Detayları

1. H2 Outline Oluşturma

Prompt: "'{topic}' konusu için 4-5 H2 başlığı belirle"

Yasaklı Başlıklar: Giriş, Sonuç, Hakkında, İletişim (AI yazısı belli eder)

Doğru Başlıklar: "Transpalet Nedir ve Nasıl Çalışır?", "Manual vs Elektrikli Transpalet"

Çıktı: JSON array ["H2 1", "H2 2", ...]

2. Her H2 İçeriği (500-600 kelime)

Gereksinimler:

  • 4-6 paragraf (her biri 120-150 kelime)
  • 3-4 H3 alt başlık (İngilizce: "must")
  • Liste (
    • ) ve tablolar (uygunsa)
    • Firma adı kullan (ilk/son bölümde)
    • HTML output (ikonlar YASAK)

    max_tokens: 3500 per section (1200 kelime space)

3. FAQ Üretimi (10 soru)

[{ "question": {"tr": "Soru?"}, "answer": {"tr": "50-80 kelime cevap"}, "icon": "fas fa-question-circle" // FontAwesome }]

4. HowTo Schema (7 adım)

{ "name": {"tr": "Başlık"}, "description": {"tr": "Açıklama"}, "steps": [ { "name": {"tr": "Adım 1"}, "text": {"tr": "80-100 kelime detay"}, "icon": "fas fa-check-circle" } ] }

5. Leonardo AI Featured Image

Provider: Leonardo.AI (sektöre özgü)

Storage: Tenant disk'e hero collection'a kaydedilir

Metadata: alt_text, title, description, seo_optimized=true, og_image=true

Conversion: sync mode (queue'ya atılmaz, tenant context hatası önlenir)

Kategori Dinamik Seçimi

1

Draft Kategorisi Kontrol

category_suggestions varsa ilk öğe kullan

2

AI Seçim

OpenAI'ya başlık ve kategoriler gönder, en uygun ID'yi iste

3

Fallback

Hep yoksa varsayılan kategori (14 = Genel)

Validation & Retry

Kontrollü Alanlar:

  • Title: min 10 karakter
  • Content: min 1500 kelime (strip_tags)
  • FAQ: min 5 soru
  • HowTo: min 3 adım
  • Company name: min 1 mention (kısa veya uzun ad)

Retry: Max 3 deneme. Her deneme başarısız olursa exception fırlatılır (job retry eder).

Firma Adı Yönetimi (Kritik!)

Sorun: AI bazen uzun firma adını (ör. "İxtif Türkiye İstif Pazarı") yazıyor, "İxtif" değil.

Çözüm:
1. "Marka Adı" (kısa) vs "Firma Adı" (uzun) ayrımı
2. System message'de: "Sadece kısa adı kullan: 'İxtif'"
3. Validation'da: Her iki ad da sayılır (toplam min 1)
4. İdeal: Kısa ad 3+ kez kullanılmış

Ürün Injeksiyonu Desteği

Blog kaydedildikten sonra, template'de Tenant-specific injector çalıştırılır:

Tenant2BlogProductInjector → H2'ler arası ürün + CTA banner enjekte eder

Bu flow'un parçası değildir, template'de yapılır (show-content.blade.php)

Önemli Notlar

Credit Yönetimi: Her blog 1.0 credit harcar. Content generation sonrası düşülür (draft generation'dan ayrı).
Race Condition: İki job aynı başlıklı blog oluşturmaya çalışması engellenir. Cache lock kullanılır (120 saniye).
Iterative approach sayesinde 2000+ kelime kaliteli içerik garantisi
HowTo ve FAQ otomatik schema üretimi SEO'ya yardımcı

🔍 3. Meilisearch & Search Query Logging

Genel Yapı

Index: Ürün ve blog aramaları Meilisearch ile yapılır

Logging: Her arama SearchQuery model'e kaydedilir

Analytics: Admin panel'de popüler aramalar, zero-result aramalar gösterilir

SearchQuery Model

Alan Tür Açıklama
query string Kullanıcının arama metni
slug string Otomatik generated (query'den)
searchable_type string 'ShopProduct' | 'Blog' | null
results_count integer Kaç sonuç bulundu?
filters_applied array Kategori, fiyat range vb.
response_time_ms integer Arama süresi (ms)
locale string 'tr' | 'en' vb.
is_popular boolean Admin tarafından işaretlendi mi?
is_hidden boolean Admin gizledi mi?

Scope Metotları

SearchQuery::noResults() // results_count=0 SearchQuery::byLocale('tr') // locale filter SearchQuery::byType('Blog') // searchable_type filter SearchQuery::popular() // is_popular=true SearchQuery::visible() // is_hidden=false // Static methods: SearchQuery::getPopularSearches(10, 30) // Son 30 gün, top 10 SearchQuery::getZeroResultSearches(20, 30) // 0 sonuç, top 20 SearchQuery::getAverageResponseTime(30) // Ortalama yanıt süresi

Meilisearch Konfigürasyonu

Türkçe Support:

  • Typo Tolerance: 4+ harf: 1 typo, 8+ harf: 2 typo
  • Synonyms: "soguk" → "soğuk", "forklift" → "fork lift", vb.
  • Searchable Attributes: title, slug, description, body, category_name, brand_name, tags
  • Filterable: category_id, brand_id, is_active, base_price
  • Sortable: base_price, created_at

SEO Faydası

Zero-Result Aramaları: Arama yapıldığında sonuç yoksa bu arama veritabanına kaydedilir. Admin bu verilerden yeni blog konuları öğrenebilir. Ör: "Transpalet kaç fiyat" aranıyorsa, ürün sayfasında fiyat karşılaştırması eklenebilir veya blog yazılabilir.
Popüler Aramalar: Admin tarafından işaretlenen popüler aramalar, footer'da quick search tag'leri olarak gösterilir. Tıklanabilir, SEO friendly URL'leri vardır (slug kullanılır).

Önemli Notlar

Arama yanıt süresi ortalama: 50-100ms (çok hızlı)
Search analytics Admin'e içerik planlaması için veri sağlar

📦 4. Product Injector (Tenant 2 - ixtif.com)

Genel Fonksiyon

Blog içeriğindeki H2 başlıklar arası ürün kartları ve CTA bannerları dinamik enjekte eder.

Pattern: H2_2 öncesi (3 ürün) → H2_3 öncesi (CTA banner) → H2_4 öncesi (3 ürün) → ...
İlk H2 atlanır (header'ında ürün istemez)

Ürün Eşleştirme (4 fazlı)

Faz Kriterleri Açıklama
1. Tags Blog.tags'den exact match Ürün tag'leri blog tag'leri ile eşleşiyorsa öncelik
2. Title Blog başlığı kelimelerinden 3+ harf kelimelerden ürün title'ında arama
3. Excerpt Blog excerpt'ten kelimeler İlk 5 önemli kelime ile arama
4. Random Fallback Yeterli ürün yoksa Min 9 ürün garantisi için random ekle

Ürün Sıralama (Priority)

  1. show_on_homepage=1 olanlar (En öncelik)
  2. show_on_homepage=0 ama stok>0 veya fiyat>0 olanlar
  3. Stok veya fiyat=0 olanlar
  4. Diğer ürünler (fallback)

Ana Kategoriler (İxtif için)

ID Kategori Icon Slug
1 Forklift fa-forklift forklift
2 Transpalet fa-dolly transpalet
3 İstif Makinesi fa-boxes-stacked istif-makinesi
4 Order Picker fa-hand-holding-box siparis-toplama-makinesi
5 Otonom Sistemler fa-robot otonom-sistemler

CTA Bannerları (6 Dinamik Tema)

Blue 🔵

Animated gradient background (130°), white text

Green 💚

Animated gradient background (130°), white text

Orange 🟠

Animated gradient background (130°), white text

Purple 💜

Animated gradient background (130°), white text

Gold 🟡

Dark background, gold gradient text animation

Red 🔴

Animated gradient background (130°), white text

CTA Banner Elemanları

  • Başlık: Dinamik (ör: "Forklift'lerde En Uygun Fiyat Garantisi")
  • Alt başlık: Dinamik (ör: "Fiyat almadan karar vermeyin!")
  • X Logosu: İxtif markası (rounded box, glass efekt)
  • Kategori Badge: İlgili kategori link ile (icon + slug)
  • 3 Button:
    • Tel: site_phone (glass efekt)
    • WhatsApp: site_whatsapp (yeşil, +90 prefix)
    • Sizi Arayalım: /sizi-arayalim (glass efekt)
  • Trust Badges (Desktop): "En Uygun Fiyat", "Hızlı Teslimat", "Garanti", "7/24 Destek"

Ürün Rendering

Mobile/Tablet: 1 column (full width, horizontal layout)

Desktop: 3 column grid (vertical layout)

Component: components.ixtif.product-card (homepage ile aynı)

Badge: "Yazı Devam Ediyor" (chevron animate, minimal divider)

Cache & Performance

Cache Key: blog_product_injection_v4_{tenant_id}_{blog_id}

TTL: 3600 saniye (1 saat)

İsim: Blog güncellenirse cache otomatik temizlenir

Önemli Notlar

Fallback Injector: Tenant'ın injector'ı yoksa BlogProductInjector (base) kullanılır. Content olduğu gibi döner (ürün enjekte edilmez).
Keywords otomatik çıkarılır (title + tags)
Kategori dinamik eşleşmesi (keyword score bazlı)
CTA 6 farklı teması dinamik random seçilir

⚡ 5. Instant Page Preloading

Genel Fonksiyon

Sayfa hızını artırmak için kullanıcı mouseover, touch veya viewport intersection'ında link'leri önceden yükler (prefetch).

Library: instant.page v5.2.0

Teknoloji: HTML link rel=prefetch + fetchPriority API

Tetik Mekanizmaları

Tetik Açıklama Uygulanır
Touchstart Kullanıcı link'e dokundu (mobil) Yüksek öncelik (high)
Mouseover (varsayılan) Fare link'in üzerinde (desktop) 65ms delay (ayarlanabilir)
Viewport Intersection Link ekranda görünür (intersection observer) requestIdleCallback ile (boş CPU döneminde)

Mouseover Gecikmesi (Delay)

Varsayılan: 65ms

Amaç: "Accident hover" (yanlışlıkla üstüne gelmek) engelle

Data attribute ile özelleştirme:

<body data-instant-intensity="100"> // 100ms delay <body data-instant-intensity="mousedown"> // Click'te preload <body data-instant-intensity="viewport"> // Ekranda görünce

Prefetch Priority Optimization

Touch/Mouseover: FetchPriority = "high" (müdahale ihtimali yüksek)

Viewport Intersection: FetchPriority = "auto" (zaman var, düşük öncelik)

Avantaj: Önemli resourcelar tercih edilir, diğer download engellenmez

Chromium Compatibility Handling

Vary: Accept Header Issue: Chromium 79-109'da Vary: Accept header prefetch'i geçersiz kılıyordu.

Çözüm: Chromium 110+ için enable, altında disable (script otomatik kontrol eder)

Shopify Exception: Shopify siteleri de etkilendiği için kontrol edilir

Data Saver & Low Connection Detection

Viewport mode'unda: Şu durumlarda preload YAPMA:

  • navigator.connection.saveData = true (Kullanıcı veri tasarrufu açık)
  • navigator.connection.effectiveType = "2g" (Çok yavaş bağlantı)

Avantaj: Bandwidth korunur, veri tasarrufu kullanıcılarına saygı gösterilir

Whitelist Mode (Opsiyonel)

Default: Tüm link'ler preload'a uygun (blacklist mode)

Whitelist Mode:

<body data-instant-whitelist> <a href="..." data-instant>Preload yap</a> <a href="...">Preload yapma</a>

Kullanım: Harici link'leri (external) kontrol etmek istersek

External Links & Cross-Origin

Cross-origin prefetch: "restrictive prefetch" (Chromium özelliği)

Default: Cross-origin link'ler prefetch'e uygun değil

Enable: data-instant-allow-external-links attribute'ü veya config

Query String & Hash Handling

Query String: Varsayılan olarak YAPMA (her kombinasyon farklı sayfa kabul edilir)

Enable: data-instant-allow-query-string attribute'ü

Hash: Aynı sayfa içi bölüm linkse YAPMA (zaten yüklü)

Önemli Notlar

Ortalama sayfa yükleme: 200-300ms → 50-100ms (3-5x hızlı)
Network bant genişliği optimize edilir (high priority tekil)
Mobil veri tasarrufu desteği (saveData API)
Module Scripts: instant.page <script type="module" src="..."> ile yüklenmeli (tercihen)

🔄 Sistemler Arası Entegrasyon

Blog Yaşam Döngüsü

1

Draft Generation

BlogAIDraftGenerator: 25+ taslak üret, database'e kaydet

2

Admin Selection

Admin taslakları inceler, seçilen taslaklar is_selected=true

3

Content Generation

BlogAIContentWriter: Seçilmiş taslaktan tam blog yaz, featured image üret

4

Database Insert

Blog model oluştur, SEO setting'leri ekle, kategori attach et

5

Frontend Rendering

show-content.blade.php: Product injector çalıştır, Instant Page aktif et

6

Search Logging

Arama yapılırsa SearchQuery kaydet, analytics güncellensin

Meilisearch - Blog Indexing

Meilisearch Attributes:

  • title (searchable, in display list)
  • slug (searchable, filterable)
  • body (searchable, long text)
  • excerpt (searchable, snippet için)
  • category_name (searchable, filter)
  • tags (searchable, array)
  • blog_id (filterable, unique)
  • is_active (filterable)
  • published_at (filterable, sortable)

Index Name: blogs_tenant_{tenant_id}

Şema & Meta Data Flow

Blog Model (Universal Schemas):

  • getSeoFallbackSchemaMarkup() → BlogPosting + Organization + Publisher
  • getBreadcrumbSchema() → BreadcrumbList (Home → Blog → Category → Post)
  • faq_data → FAQPage schema
  • howto_data → HowToSchema

🎯 Kilit Özellikleri

1. AI Content Writer'ın Iterative Approach

Adımlar:
✓ Outline oluştur (4-5 H2)
✓ Her H2'yi 500-600 kelime ile genişlet (3-4 H3 zorunlu)
✓ FAQ döngüsü (10 soru)
✓ HowTo döngüsü (7 adım)
✓ Leonardo AI görsel üret
✓ Extraction/Fallback mekanizması

2. Firma Adı Yönetimi

Sistem:
✓ Kısa ad (İxtif) vs Uzun ad (İxtif Türkiye İstif Pazarı) farkı
✓ System message'de kısa ad önerilir (3+ mention)
✓ Validation'da her iki ad kontrol edilir (min 1)
✓ Perfect: Kısa ad 3+ kez kullanılmış

3. Product Injector Pattern

Pattern:
✓ H2_2 öncesi: 3 ürün
✓ H2_3 öncesi: CTA banner
✓ H2_4 öncesi: 3 ürün
✓ ...
✓ İlk H2 atlanır

4. SEO & Structured Data

Otomatik Üretim:
✓ BlogPosting schema
✓ FAQPage schema
✓ HowToSchema
✓ BreadcrumbList
✓ ArticleSchema
✓ Og:image, canonical URL

5. Tenant Awareness

Tenant-specific:
✓ BlogAIDraftGenerator: Tenant prompt enhancement
✓ BlogAIContentWriter: Tenant writing style
✓ Tenant2BlogProductInjector: İxtif ürünleri
✓ Settings: blog_ai_professional_only, credit limits
✓ Database: tenant database'e yapılır (otomatik)

6. Performance Optimizations

Cache & Speed:
✓ Product injection caching (1 saat)
✓ Media conversion sync mode (queue değil)
✓ Instant Page preloading (3-5x hızlanma)
✓ Meilisearch sub-100ms response
✓ Lazy loading + responsive images

⚙️ Ayarlar & Configurations

Blog AI Settings (SettingManagement)

Setting Key Açıklama Varsayılan
blog_ai_monthly_draft_limit Aylık taslak batch'i limiti 10 (10 batch/ay)
blog_ai_daily_content_limit Günlük blog yazı limiti 5 (5 blog/gün)
blog_ai_professional_only Sadece Profesyonel/Uzman stil kullan 0 (false, all styles)
blog_featured_image_provider Featured image provider leonardo (Leonardo AI)

Meilisearch Config

MEILISEARCH_HOST=http://localhost:7700 MEILISEARCH_KEY=api-key-here // Typo tolerance minWordSizeForTypos: {oneTypo: 4, twoTypos: 8} // Synonyms: soguk → soğuk, forklift → fork lift, vb. // Ranking rules: words > typo > proximity > attribute > sort > exactness

Tailwind CSS (Product Cards)

Responsive Breakpoints:

  • xs-md: 1 column (horizontal layout)
  • lg+: 3 column grid (vertical layout)

Spacing: gap-6 (mobile), gap-8 (desktop)

🔧 Troubleshooting

Blog Generation Başarısızlığı

Sorun: "Content too short" error

Çözüm: max_tokens 3500'e yükselt, retry count artır

Sorun: Firma adı yazılmamış

Çözüm: System message'de marka adı daha belirgin yap, retry et

Sorun: Leonardo AI timeout/fail

Çözüm: Leonardo service check, fallback görsel ekle, email gönder

Product Injection Sorunları

Sorun: Ürünler göstermiyor

Çözüm: Matching products query kontrol et, tag/title eşleştir

Sorun: CTA button link'i yanlış

Çözüm: Setting'leri kontrol et (site_phone, site_whatsapp)

Meilisearch Sorunları

Sorun: Arama sonuç dönmüyor

Çözüm: Index synchronization kontrol et, reindex gerekebilir

Sorun: Türkçe karakter sorunu (soguk)

Çözüm: Synonym'ler zaten var, typo tolerance aktif

✨ Sonuç

Blog modülü ve Meilisearch entegrasyonu, tamamen otomasyon ve akıl yoluyla çalışan, profesyonel SEO-optimized içerik yönetim sistemidir.

Ana Güçlü Yanlar:

  • ✅ AI ile otomatik 2000+ kelime blog yazısı
  • ✅ Iterative content generation (outline → sections → FAQ → HowTo)
  • ✅ Universal Schemas (BlogPosting, FAQ, HowTo) otomatik
  • ✅ Tenant-aware ürün injeksiyonu (dinamik eşleştirme)
  • ✅ 6 farklı CTA tema + phone/whatsapp entegrasyonu
  • ✅ Meilisearch ile hızlı arama (Türkçe typo tolerance)
  • ✅ Search analytics (zero-result, popüler aramalar)
  • ✅ InstantPage preloading (3-5x hızlı sayfa açılış)
  • ✅ Leonardo AI görsel üretimi (sektöre özel)
  • ✅ Yazım stilleri (Profesyonel, Samimi, Uzman)