SEO Management Sistemi

Kapsamlı Analiz ve Kullanım Rehberi

SeoManagement Modülü Multi-Tenant Çoklu Dil Desteği

Basit Anlatım (Herkes İçin)

SEO Nedir?

SEO (Arama Motoru Optimizasyonu), web sitelerinin Google gibi arama motorlarında daha üst sıralarda çıkmasını sağlayan ayarlardır. İyi bir SEO, daha fazla ziyaretçi demektir.

Sistem Ne Yapıyor?

  • Her sayfa için ayrı SEO başlığı ve açıklaması tanımlayabilirsiniz
  • Sosyal medya paylaşımlarında özel görsel ve metin gösterebilirsiniz
  • Google'a hangi sayfaları indekslemesi gerektiğini söyleyebilirsiniz
  • Türkçe, İngilizce gibi farklı dillerde SEO ayarı yapabilirsiniz

Neden Önemli?

Doğru SEO ayarları yapıldığında sayfalarınız Google aramalarında üst sıralarda çıkar, sosyal medyada paylaşıldığında düzgün görünür ve daha fazla kişi sitenizi ziyaret eder.

Teknik Detaylar - Sistem Mimarisi

Dosya Yapısı

Modules/SeoManagement/
├── App/
│   ├── Models/
│   │   └── SeoSetting.php
│   ├── Services/
│   │   ├── SeoService.php
│   │   ├── SeoAIService.php
│   │   └── SchemaGeneratorService.php
│   └── Http/Livewire/Admin/
│       ├── UniversalSeoComponent.php
│       └── UniversalSeoTabComponent.php
├── database/migrations/
│   ├── tenant/
│   │   └── 2025_07_19_000001_create_seo_settings_table.php
│   └── 2025_07_19_000001_create_seo_settings_table.php
└── resources/views/components/
    └── universal-seo-tab.blade.php

app/
├── Traits/HasSeo.php
├── Services/SeoMetaTagService.php
└── Models/SeoSetting.php

Çalışma Prensibi

1 Model HasSeo trait kullanır
2 Polymorphic ilişki ile seo_settings tablosuna bağlanır
3 Admin panelde SEO tab bileşeni görüntülenir
4 Frontend'de SeoMetaTagService meta tag'leri üretir
5 Blade layout'ta meta tag'ler render edilir

Veritabanı Şeması - seo_settings Tablosu

Kolon Tip Zorunlu Açıklama
seoable_type VARCHAR(255) Evet Model class adı (örn: Modules\Page\App\Models\Page)
seoable_id BIGINT Evet Model ID (polymorphic relation)
titles JSON Önerilen SEO başlıkları {"tr": "Başlık", "en": "Title"}
descriptions JSON Önerilen Meta description {"tr": "Açıklama", "en": "Description"}
og_titles JSON Opsiyonel Open Graph başlıkları (sosyal medya)
og_descriptions JSON Opsiyonel Open Graph açıklamaları
og_image VARCHAR(255) Opsiyonel Sosyal medya paylaşım görseli URL
og_type VARCHAR(255) Default: website website, article, product vb.
canonical_url VARCHAR(255) Opsiyonel Canonical URL (duplicate content önleme)
robots_meta JSON Default: index,follow {"index": true, "follow": true}
schema_type JSON Opsiyonel Schema.org tipi {"tr": "Article"}
seo_score INT Default: 0 SEO puanı (0-100)
author VARCHAR(255) Opsiyonel İçerik yazarı (E-E-A-T için)
author_url VARCHAR(255) Opsiyonel Yazar profil URL'si
priority_score INT Default: 5 Öncelik puanı (1-10)
status ENUM Default: active active, inactive, pending

Tenant SEO Durumları

Tenant 2 - İxtif (Endüstriyel)

Database: tenant_ixtif

Toplam SEO Kaydı: 4,178
Blog SEO: 3,081
Shop Product SEO: 1,020
Page SEO: 12
Blog Category SEO: 14
SEO sistemi aktif ve dolu

Tenant 3 - Yıldırım Panjur

Database: tenant_yildirimpanjur_04d389

Toplam SEO Kaydı: 14
Service SEO: 9
Page SEO: 3
Service Category SEO: 1
SEO sistemi aktif, yeni site

Modele SEO Desteği Nasıl Eklenir?

1 Model'e HasSeo Trait Ekle

<?php
namespace Modules\Service\App\Models;

use App\Models\BaseModel;
use App\Traits\HasTranslations;
use App\Traits\HasSeo;

class Service extends BaseModel
{
    use HasTranslations, HasSeo;

    // ... model kodu
}

2 Opsiyonel: SEO Fallback Metodlarını Override Et

/**
 * SEO başlığı için fallback
 */
public function getSeoFallbackTitle(): ?string
{
    return $this->getTranslated('title', app()->getLocale());
}

/**
 * SEO açıklaması için fallback
 */
public function getSeoFallbackDescription(): ?string
{
    $content = $this->getTranslated('body', app()->getLocale());
    return \Illuminate\Support\Str::limit(strip_tags($content), 160);
}

/**
 * Canonical URL için fallback
 */
public function getSeoFallbackCanonicalUrl(): ?string
{
    return $this->getUrl();
}

3 Admin Panelde SEO Tab'ı Göster

{{-- manage.blade.php içinde --}}
<x-seomanagement::universal-seo-tab
    :model="$model"
    :available-languages="$availableLanguages"
    :current-language="$currentLanguage"
    :seo-data-cache="$seoDataCache"
/>

4 Livewire Component'te SEO Kaydet

// Livewire component'te
public function save()
{
    // ... validasyon

    $this->model->save();

    // SEO verilerini kaydet
    if ($this->model->seoSetting) {
        foreach ($this->availableLanguages as $lang) {
            $this->model->updateSeoForLanguage($lang, [
                'title' => $this->seoDataCache[$lang]['seo_title'] ?? '',
                'description' => $this->seoDataCache[$lang]['seo_description'] ?? '',
                'og_title' => $this->seoDataCache[$lang]['og_title'] ?? '',
                'og_description' => $this->seoDataCache[$lang]['og_description'] ?? '',
            ]);
        }
    }
}

Örnek SEO Verisi (JSON Format)

{
    "seoable_type": "Modules\\Service\\App\\Models\\Service",
    "seoable_id": 5,
    "titles": {
        "tr": "Garaj Kapısı Istanbul | Otomatik Garaj Kapıları | Yıldırım Panjur",
        "en": "Garage Door Istanbul | Automatic Garage Doors | Yıldırım Panjur"
    },
    "descriptions": {
        "tr": "Seksiyonel garaj kapısı, otomatik garaj kapısı kurulumu ve tamiri. Uzaktan kumandalı, güvenlik sensörlü sistemler. 5 yıl garanti!",
        "en": "Sectional garage door, automatic garage door installation and repair. Remote controlled, security sensor systems. 5 year warranty!"
    },
    "og_titles": {
        "tr": "Garaj Kapısı Sistemleri",
        "en": "Garage Door Systems"
    },
    "og_descriptions": {
        "tr": "Profesyonel garaj kapısı çözümleri",
        "en": "Professional garage door solutions"
    },
    "og_type": "website",
    "robots_meta": {
        "index": true,
        "follow": true,
        "archive": true
    },
    "seo_score": 85,
    "priority_score": 7,
    "status": "active"
}

Önemli Notlar ve En İyi Uygulamalar

Karakter Limitleri

  • SEO Title: Maksimum 60 karakter (30-60 ideal)
  • Meta Description: Maksimum 160 karakter (120-160 ideal)
  • OG Title: Maksimum 60 karakter
  • OG Description: Maksimum 155 karakter

Çoklu Dil Desteği

  • Tüm metin alanları JSON formatında çoklu dil destekler
  • Format: {"tr": "Değer", "en": "Value"}
  • Fallback sistemi: Dil bulunamazsa varsayılan dile döner

AI SEO Önerileri

  • Admin paneldeki "AI Önerileri" butonu ile otomatik SEO içerik üretilebilir
  • AI önerileri ai_suggestions kolonunda saklanır
  • Öneriler tüm diller için aynı anda üretilir

Robots Meta Değerleri

index: true Sayfayı indeksle
follow: true Linkleri takip et
archive: true Cache'e izin ver
noindex Sayfayı indeksleme

Migration Komutları

# Central database için
php artisan migrate --force

# Tenant database'ler için
php artisan tenants:migrate --force

# Migration dosya konumu:
# Modules/SeoManagement/database/migrations/tenant/