İçeriğe geç

Arama ve SEO

Site içi arama

Ön yüzdeki küresel arama tek bir kaynaktan değil, sağlayıcılardan beslenir. Çekirdek hiçbir modülü doğrudan çağırmaz (Modules\* import etmez); sağlayıcılar etiketle toplanır. Etkin olmayan modül konteynerde yoktur, sayfa ayakta kalır.

Sağlayıcı yazmak

final class ShopSearchProvider implements SearchProviderInterface
{
    public function getKey(): string { return 'shop'; }
    public function getLabel(): string { return 'shop.search.label'; }
    public function getIcon(): string { return 'heroicons:shopping-bag'; }
    public function getPriority(): int { return 50; }

    public function search(string $term, string $locale, int $limit): SearchGroup
    {
        $hits = [];
        foreach ($this->products->findByTerm($term, $locale, $limit) as $p) {
            $hits[] = new SearchHit(title: $p->getName(), url: '/'.$locale.'/shop/'.$p->getSlug(), excerpt: $p->getSummary());
        }
        return new SearchGroup(key: 'shop', label: 'Ürünler', icon: 'heroicons:shopping-bag', hits: $hits, moreUrl: '/'.$locale.'/shop?q='.urlencode($term));
    }
}

Hizmet olarak tanımlanınca (autoconfigure) sağlayıcı otomatik toplanır. GlobalSearchService her sağlayıcıyı ayrı çağırır: bir sağlayıcı hata verirse yalnızca o grup düşer, sayfa 500 vermez. search() içinde sorgu yaparken LIKE kaçışlarına (%, _, \) dikkat edin ve kullanıcı girdisini asla sorguya doğrudan eklemeyin.

Çekirdekte yerleşik sağlayıcı: içerik (Node'lar). Blog, Forum, Belgeler gibi modüller kendilerininkini ekler.

Sınırlar

Dahili sağlayıcılar basit metin eşleşmesi (LIKE) kullanır. Çok büyük içerik kümelerinde tam metin indeksi (MySQL FULLTEXT) ya da dış arama motoru bir sağlayıcının içine yazılabilir; sözleşme buna engel değildir.

Panel canlı araması

Hem Studio hem AACP üst çubuğunda yazdıkça sonuç veren arama vardır. Üç yerleşik kaynak: içerik, kullanıcılar ve panel menüsündeki sayfalar (menü öğesi adıyla aranabilir). Modül eklemek için AdminSearchProviderInterface:

final class ShopAdminSearch implements AdminSearchProviderInterface
{
    public function getPriority(): int { return 40; }

    public function search(string $term, string $panel, int $limit): ?array
    {
        if ($panel !== 'studio') { return null; }   // yalnız Studio'da sonuç ver
        return [ /* grup ve sonuç satırları */ ];
    }
}

null döndürmek "bu panelde katkım yok" demektir.

SEO modülü

Çekirdek yalnızca SeoHeadRendererInterface sözleşmesini bilir: tam bir <head> üretimi isteğe bağlıdır. Seo modülü bunu uygular; modül yoksa çekirdek temel etiketlerle yetinir. Seo modülü kurulumla birlikte gelir.

Başlık ve açıklama

  • core.default_meta_title_format (%%title%% – %%site_name%%) ve seo.default_title / seo.default_description genel varsayılanlardır.
  • İçerik türü başına şablonlar: seo.page.title_template, seo.blog.title_template, seo.forum.title_template… Her modülün ana sayfası için ayrı başlık, açıklama ve anahtar kelime ayarı vardır (seo.blog.home_title, seo.forum.home_description…).
  • Tek tek içerikte başlık ve açıklama geçersiz kılınabilir.

Open Graph, Twitter ve doğrulama

seo.default_og_image, seo.og_title, seo.og_description, seo.twitter_site, seo.twitter_card, seo.facebook_app_id. Arama konsolu doğrulama kodları: seo.google_site_verification, seo.bing_site_verification, seo.yandex_site_verification.

Yapılandırılmış veri (schema.org)

SchemaOrgBuilder içerik türüne göre JSON-LD üretir. Şablonda cp_schema_org Twig işleviyle çizilir. Kuruluş bilgisi için seo.organization_name, seo.organization_description ve sosyal profil bağlantıları (seo.same_as) kullanılır.

Site haritası ve robots.txt

Adres Ne
/sitemap.xml Site haritası
/robots.txt Robots kuralları
/llms.txt Yapay zeka tarayıcıları için site özeti (seo.llms_enabled, seo.llms_intro)
/{dil}/blog/feed.xml Blog RSS beslemesi (seo.feed_enabled)

Site haritası önbelleğe alınır; cp:seo:rebuild-sitemap komutu eksik SEO varsayılanlarını ekler ve önbelleği temizler. Zamanlanmış görev seo.rebuild_sitemap saatlik ısıtma yapar.

Yapay zeka tarayıcıları: seo.ai_search_bots (arama amaçlı botlar) ve seo.ai_training_bots (eğitim amaçlı botlar) ayrı ayrı yönetilir. Yani sitenizin yapay zeka aramalarında görünmesine izin verip modellerin eğitiminde kullanılmasını reddedebilirsiniz.

IndexNow

İçerik değişince Bing ve Yandex'e IndexNow protokolüyle hangi URL'lerin değiştiğini bildirir. seo.indexnow_enabled, anahtar dosyası /{anahtar}.txt altında sunulur. Gönderim seo.indexnow görevi ile 10 dakikada bir toplu yapılır.

Yönlendirmeler ve 404 günlüğü

  • Yönlendirmeler (SeoRedirect): eski adresten yenisine 301/302. Site taşırken eski URL'leri korumanın yolu budur.
  • 404 günlüğü (SeoNotFound): bulunamayan adresleri sayar; sık görülenleri yönlendirmeye çevirmek için kullanılır. 30 gündür görülmeyen satırlar seo.purge_not_found görevi ile silinir.
  • SEO denetimi ekranı (Studio) yayınlanmış içeriğin SEO durumunu kontrol eder (blog yazısı denetimleri için Blog modülü gerekir).

Ortak adres

seo.public_base_url ayarı, site vekil/CDN arkasındayken kanonik adreslerin hangi ana alan adıyla üretileceğini söyler.

Modül yazarı için SEO kontrol listesi

  1. İçerik sayfanız <title>, açıklama ve canonical taşısın.
  2. Dil sürümleri varsa hreflang karşılıklarını verin.
  3. Sayfanız site haritasında olmalıysa modül için sitemap sağlayıcısı ekleyin.
  4. Adres yapısını değiştirirseniz eski adresler için 301 haritası bırakın.
  5. Arama sağlayıcısı ekleyin (yukarıda).
Son güncelleme: 13.10.2026