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%%) veseo.default_title/seo.default_descriptiongenel 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ırlarseo.purge_not_foundgö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
- İçerik sayfanız
<title>, açıklama vecanonicaltaşısın. - Dil sürümleri varsa
hreflangkarşılıklarını verin. - Sayfanız site haritasında olmalıysa modül için sitemap sağlayıcısı ekleyin.
- Adres yapısını değiştirirseniz eski adresler için 301 haritası bırakın.
- Arama sağlayıcısı ekleyin (yukarıda).