📊 SEO & Marketing Analizi

Muzibu SEO & Marketing Platform Analizi

Schema.org Implementasyonu + Marketing Platform Durumu

09 Ocak 2026

📝 Özet

✅ Çalışan Sistemler

  • ✅ Marketing component sistemi hazır (x-marketing.auto-platforms)
  • ✅ Blog modülünde Schema sistemi çalışıyor (HasUniversalSchemas)
  • ✅ SEOService.php getAllSchemas methodu hazır
  • ✅ Layout'ta schema injection çalışıyor

❌ Eksikler

  • ❌ Muzibu model'lerinde HasUniversalSchemas trait yok
  • ❌ Schema markup methodları eksik veya yetersiz
  • ❌ Marketing platform ID'leri settings'te yok (GTM, GA4, FB Pixel)
  • ❌ Breadcrumb schema implementasyonu eksik

📢 1. Marketing Platform Durumu

📝 Basit Anlatım (Herkes İçin)

Sitede Google Analytics, Facebook Pixel gibi pazarlama araçları için hazır bir sistem var. Ancak bu araçların ID'leri (kimlik numaraları) henüz ayarlarda tanımlanmamış. ID'leri ekleyince otomatik olarak çalışmaya başlayacak.

🎯 Sonuç:

Marketing sistemi hazır ama boş. ID'leri girdikten sonra aktif olacak.

🔧 Teknik Detaylar (Geliştiriciler İçin)

Component Dosyası:

resources/views/components/marketing/auto-platforms.blade.php

Desteklenen Platformlar:

marketing_gtm_id

Google Tag Manager

marketing_ga4_id

Google Analytics 4

marketing_fb_pixel_id

Facebook Pixel

marketing_yandex_metrika_id

Yandex Metrika

marketing_linkedin_partner_id

LinkedIn Insight

marketing_tiktok_pixel_id

TikTok Pixel

marketing_ms_clarity_id

Microsoft Clarity

Layout Entegrasyonu:

resources/views/themes/muzibu/layouts/app.blade.php (Line 462)
<x-marketing.auto-platforms /> component çağrılıyor.

⚠️ Neden Çalışmıyor?

Component kodu şöyle çalışıyor:

@if($gtmId) <!-- Google Tag Manager --> <script>...</script> @endif

Eğer $gtmId boşsa (null), script hiç yüklenmiyor. Settings'te marketing_gtm_id değeri olmadığı için şu anda hiçbir marketing platform aktif değil.

🎵 2. Muzibu Model'leri & Field'ları

📝 Basit Anlatım

Muzibu'da 7 farklı içerik tipi var: Şarkı, Albüm, Sanatçı, Playlist, Tür, Sektör, Radyo. Her birinin Google'a "ben neyim, ne içeriğim var" diye bildirmesi gerekiyor. Şu anda bu bildirimler eksik veya yetersiz.

🎯 Hedef:

Her model için Google'ın anladığı Schema.org yapısını ekleyeceğiz.

Song (Şarkı)

muzibu_songs table

MusicRecording
title lyrics duration play_count album_id genre_id

✅ Mevcut Schema:

getSeoFallbackSchemaMarkup() method var (MusicRecording)

⚠️ Eksik: HasUniversalSchemas trait eklenmeli (FAQ, HowTo, Breadcrumb için)

🔗 İlişkiler:

  • → Album (belongsTo)
  • → Artist (hasOneThrough Album)
  • → Genre (belongsTo)

Album

muzibu_albums table

MusicAlbum
title description artist_id

✅ Mevcut Schema:

getSeoFallbackSchemaMarkup() method var (MusicAlbum)

⚠️ Eksik: HasUniversalSchemas trait eklenmeli

🔗 İlişkiler:

  • → Artist (belongsTo)
  • → Songs (hasMany)

Artist (Sanatçı)

muzibu_artists table

MusicGroup
title bio

✅ Mevcut Schema:

getSeoFallbackSchemaMarkup() method var (MusicGroup)

⚠️ Eksik: HasUniversalSchemas trait eklenmeli

🔗 İlişkiler:

  • → Albums (hasMany)
  • → Songs (hasManyThrough Albums)

Playlist

muzibu_playlists table

MusicPlaylist
title description is_system is_public

✅ Mevcut Schema:

getSeoFallbackSchemaMarkup() method var (MusicPlaylist)

⚠️ Eksik: HasUniversalSchemas trait eklenmeli

🔗 İlişkiler:

  • → Songs (belongsToMany - pivot table)
  • → User (belongsTo)

Genre (Tür)

muzibu_genres table

MusicGenre
title description

✅ Mevcut Schema:

getSeoFallbackSchemaMarkup() method var (MusicGenre)

❌ Eksik: HasUniversalSchemas trait yok + Schema çok basit

🔗 İlişkiler:

  • → Songs (hasMany)
  • → Playlists (morphToMany - playlistables)

Sector (Sektör)

muzibu_sectors table

❌ Schema Yok
title description

❌ Schema Yok:

HasSeo trait yok, schema method yok

🔧 Eklenecek: HasSeo + HasUniversalSchemas + CollectionPage schema

🔗 İlişkiler:

  • → Playlists (morphToMany - playlistables)
  • → Radios (belongsToMany)

Radio (Radyo)

muzibu_radios table

RadioStation
title

✅ Mevcut Schema:

getSeoFallbackSchemaMarkup() method var (RadioStation)

⚠️ Eksik: HasUniversalSchemas trait eklenmeli

🔗 İlişkiler:

  • → Sectors (belongsToMany)
  • → Playlists (morphToMany - playlistables)

🏗️ 3. Mevcut Schema Sistemi Analizi

📝 Basit Anlatım

Sistem iki katmanlı çalışıyor:

  1. Ana Schema: Her modelin kendi içerik tipi (Şarkı, Albüm vs.)
  2. Evrensel Schema'lar: FAQ (Sık Sorulan Sorular), HowTo (Nasıl Yapılır), Breadcrumb (Ekmek Kırıntısı)

Blog modülü bu sistemi kullanıyor, Muzibu modelleri henüz kullanmıyor.

🔧 Teknik Detaylar

1. SEOService (Ana Yönetici):

app/Services/SEOService.php

getAllSchemas($model) methodu:

  • → Model'de renderUniversalSchemas() varsa çağırır (FAQ, HowTo, Breadcrumb)
  • → Model'de getSchemaMarkup() varsa çağırır (Ana schema)
  • → JSON-LD formatında script tag'leri döndürür

2. HasUniversalSchemas Trait:

app/Traits/HasUniversalSchemas.php

Sağladığı method'lar:

  • getFaqSchema(): faq_data field'ından FAQPage schema üretir
  • getHowToSchema(): howto_data field'ından HowTo schema üretir
  • getBreadcrumbSchema(): Override edilmeli (her model kendi mantığı)
  • getUniversalSchemas(): Hepsini toplar
  • renderUniversalSchemas(): JSON-LD script tag'leri oluşturur

3. HasSeo Trait:

app/Traits/HasSeo.php

Sağladığı method'lar:

  • getSeoFallbackTitle(): SEO başlığı
  • getSeoFallbackDescription(): SEO açıklaması
  • getSeoFallbackSchemaMarkup(): Ana schema (override edilmeli)
  • getSchemaMarkup(): Fallback'i çağırır

🔗 Layout Entegrasyonu

Layout dosyasında (app.blade.php Line 458) şu kontrol var:

@if(!$hasControllerSchemas && isset($item) && is_object($item) && method_exists($item, 'getUniversalSchemas')) {!! \App\Services\SEOService::getAllSchemas($item) !!} @endif

Eğer controller'dan schema gelmemişse ve $item variable'ında model varsa, otomatik olarak schema'ları render eder.

📋 4. Eksikler & Yapılacaklar

📢 Marketing Platform Eksikleri

1️⃣

Settings Tablosuna ID Ekle

Settings'te marketing platform ID'lerini tanımla (GTM, GA4, FB Pixel vs.)

marketing_gtm_id = "GTM-XXXXXX"
2️⃣

Admin Panel'e Setting Grubu Ekle

Marketing Platform ayarlarını admin panel'den düzenlenebilir yap

🏗️ Schema Implementasyon Eksikleri

1️⃣

HasUniversalSchemas Trait Ekle

Tüm Muzibu model'lerine HasUniversalSchemas trait'i ekle

Song → use HasUniversalSchemas;
Album → use HasUniversalSchemas;
Artist → use HasUniversalSchemas;
Playlist → use HasUniversalSchemas;
Genre → use HasUniversalSchemas;
Radio → use HasUniversalSchemas;
2️⃣

Sector Model'e Schema Ekle

Sector model'inde şu anda hiç schema yok. HasSeo trait'i bile yok.

use HasSeo, HasUniversalSchemas;
3️⃣

Breadcrumb Schema Implement Et

Her model'de getBreadcrumbSchema() methodu override edilmeli.

Ana Sayfa → Şarkılar → [Şarkı Adı]
4️⃣

Controller'larda $item Variable'ını Sağla

Layout'ta $item variable'ı kontrol ediliyor. Controller'lardan view'e model gönder.

return view('...', ['item' => $song]);
5️⃣

Database'e faq_data & howto_data Field'ları Ekle

HasUniversalSchemas trait'i bu field'ları kullanıyor. Migration ile ekle.

$table->json('faq_data')->nullable();
$table->json('howto_data')->nullable();
6️⃣

Schema Markup'ları Zenginleştir

Mevcut schema'lar temel seviyede. Daha fazla property ekle:

Song → datePublished, recordingOf, audio URL
Album → releaseDate, track list
Artist → sameAs (social links), foundingDate
Playlist → creator, track array

💡 5. Örnek: Blog Model Pattern (Referans)

📝 Nasıl Çalışıyor?

Blog modülü schema sistemini doğru kullanıyor. Muzibu model'leri için aynı pattern'i uygulayacağız.

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

class Blog extends BaseModel implements TranslatableEntity, HasMedia { use HasSeo, HasUniversalSchemas; // ✅ İki trait birlikte protected $fillable = [ 'title', 'slug', 'body', 'excerpt', 'faq_data', 'howto_data', // ✅ JSON field'lar ]; protected $casts = [ 'faq_data' => 'array', 'howto_data' => 'array', // ✅ JSON cast ]; // ✅ Ana schema (Article) public function getSeoFallbackSchemaMarkup(): ?array { return [ '@context' => 'https://schema.org', '@type' => 'Article', 'headline' => $this->getSeoFallbackTitle(), 'description' => $this->getSeoFallbackDescription(), 'url' => $this->getSeoFallbackCanonicalUrl(), 'image' => $this->getSeoFallbackImage(), 'datePublished' => $this->published_at?->toISOString(), ]; } // ✅ Breadcrumb schema (override edilmiş) public function getBreadcrumbSchema(): ?array { return [ '@context' => 'https://schema.org', '@type' => 'BreadcrumbList', 'itemListElement' => [ [ '@type' => 'ListItem', 'position' => 1, 'name' => 'Home', 'item' => url('/') ], [ '@type' => 'ListItem', 'position' => 2, 'name' => 'Blog', 'item' => url('/blog') ], [ '@type' => 'ListItem', 'position' => 3, 'name' => $this->title, 'item' => $this->getUrl() ] ] ]; } }

🎯 Sonuç

Bu pattern sayesinde Blog modeli otomatik olarak 4 farklı schema üretiyor:

  • 1️⃣ Article Schema (Ana içerik)
  • 2️⃣ FAQPage Schema (faq_data'dan otomatik)
  • 3️⃣ HowTo Schema (howto_data'dan otomatik)
  • 4️⃣ BreadcrumbList Schema (manuel override)

🗺️ 6. Implementation Roadmap

1

Marketing Platform Setup

Settings tablosuna marketing platform ID'lerini ekle

Tinker ile ekle:

setting(['marketing_gtm_id' => 'GTM-XXXXXX']);
2

Database Migration

Muzibu tablolarına faq_data ve howto_data field'larını ekle

php artisan make:migration add_schema_fields_to_muzibu_tables
3

Model Updates

Her model'e HasUniversalSchemas trait ekle + fillable/casts güncelle

use HasUniversalSchemas;
protected $fillable = [..., 'faq_data', 'howto_data'];
protected $casts = ['faq_data' => 'array', 'howto_data' => 'array'];
4

Breadcrumb Schema Implementation

Her model'de getBreadcrumbSchema() method'unu override et

public function getBreadcrumbSchema(): ?array { ... }
5

Controller Updates

Controller'larda view'e $item variable'ı gönder

return view('...', ['item' => $song]);
6

Test & Validation

Google Rich Results Test ile doğrula