Bu sayfa bir Tecof temasında arama motoru görünürlüğünün nasıl çalıştığını anlatır: platformun hazır verdiği parçalar ve tema geliştiricinin eklemesi gerekenler. Üretken yapay zekâ motorları için mağaza dosyaları ayrı sayfada: GEO: AI Storefront.
Platformun hazır verdikleri#
| Konu | Nasıl çalışır |
|---|---|
| Sitemap | app/sitemap.ts; sayfalar ve ürün/kategori/marka/CMS detay sayfaları backend’den gelir |
| robots.txt | app/robots.txt/route.ts; panelde girilen içerik ya da varsayılan kurallar backend’den proxy’lenir |
| Alan adı düzeyi noindex | Panelde “arama motorlarına kapalı” alan adı (ücretsiz tecof.site alt alan adı varsayılan olarak kapalı) ve yapım aşaması tüm sayfalarda noindex basar |
| Sayfa düzeyi noindex | Panel → sayfa ayarları → SEO; şablon sayfadan türeyen ürün/CMS sayfalarına miras geçer |
| Meta ve OG | Sayfa başına başlık, açıklama ve OG görseli; CMS şablon sayfalarında token’larla doldurulur |
| Çok dilli adresler | /[locale]/[...slug], dile özel adresler ve doğru dilin adresine 301 |
| Özel kod | Sayfa başına <head> ve gövde kodu (piksel, doğrulama etiketi) |
| Ürün beslemeleri | Google Merchant / Meta XML ve OpenAI CSV kataloğu (panel → E-ticaret → Ayarlar → Beslemeler) |
Sitemap#
Mutlak adresler ziyaret edilen host’tan türetilir: aynı tema hem mağazanın kendi alan adında hem tecof.site alt alan adında yayında olabilir ve Google, sitemap’i hangi host’tan çektiyse içindeki adreslerin de o host’ta olmasını ister. Sıra: istek host’u → mağazanın birincil alan adı → NEXT_PUBLIC_SITE_URL. Adres çözülemezse boş sitemap döner (yanlış host’a işaret eden sitemap zararlıdır). Sitemap saatte bir yenilenir.
robots.txt#
Tema GET /api/store/robots.txt?host=<host> ucunu vitrin anahtarıyla proxy’ler; panelde içerik yoksa backend varsayılan kuralları döner. Backend’e ulaşılamazsa şu yedek servis edilir:
User-agent: *
Allow: /
Disallow: /api/
Disallow: /editor/
Disallow: /preview-component/
Disallow: /*/preview-component/
Disallow: /preview-template/
Disallow: /preview-starter/Önizleme rotaları kimlik doğrulaması istemez; noindex arama motorunu keser, erişimi değil. Bu rotalarda gizli veri basmayın.
noindex kuralları#
- Alan adı düzeyi karar kök layout’ta,
merchant-info’dakinoIndex(istek host’una göre) ya daisUnderConstructionile verilir ve tüm sayfalara geçer. - Sayfa düzeyi
robotsyalnız sayfa kapalıyken yazılır. Açık sayfadaindex: trueyazmayın: Next.js’te sayfanınrobotsalanı layout’unkini tamamen ezer ve alan adı düzeyindeki kapatma (ör.tecof.site) sessizce kalkar. - Başlangıç içeriğiyle gelen sayfalar, mağaza metinleri düzenleyip yayınlayana kadar
noindexdoğar; şablonların değeri türeyen detay sayfalarına miras geçer.
export async function generateMetadata({ params }) {
const { slug, locale } = await params;
const page = await getPageData(slug.join("/"), locale, false);
if (!page) return {};
return {
title: page.metaTitle || undefined,
description: page.metaDescription || undefined,
...(page.noIndex && { robots: { index: false, follow: false } }),
openGraph: { title: page.metaTitle || undefined, description: page.metaDescription || undefined },
};
}Çok dilli adresler#
POST /api/store/render yanıtı istenen dilin adresini (localizedSlug), dil → adres haritasını (slugAlternates) ve adres o dile ait değilse 301 hedefini (redirectTo) taşır. Çekirdek tema yanlış dilin adresini kalıcı olarak doğru adrese yönlendirir (/en/blog/ilk-yazi → /en/blog-en/first-post) ve haritayı dil değiştiricide kullanır. Taslak önizlemede yönlendirme yapılmaz.
Temada eklemeniz gerekenler#
hreflang#
Çekirdek tema slugAlternates haritasını bugün yalnız dil değiştiricide kullanır. Arama motorlarına dil karşılıklarını bildirmek için generateMetadata içinde alternates.languages üretin:
const base = `https://${host}`;
return {
// …
alternates: {
canonical: `${base}/${locale}/${page.localizedSlug ?? slug.join("/")}`,
languages: Object.fromEntries(
Object.entries(page.slugAlternates ?? {}).map(([code, path]) => [code, `${base}/${code}/${path}`]),
),
},
};Yapılandırılmış veri (JSON-LD)#
Platform JSON-LD üretmez; ürün, içerik ve işletme bilgisini temanız basmalıdır. Ürün detay bölümünde:
export function ProductJsonLd({ product, url }: { product: Product; url: string }) {
const data = {
"@context": "https://schema.org",
"@type": "Product",
name: product.name,
image: product.images,
description: product.description,
sku: product.sku,
brand: product.brand ? { "@type": "Brand", name: product.brand } : undefined,
offers: {
"@type": "Offer",
url,
priceCurrency: product.currency,
price: product.price,
availability: product.inStock ? "https://schema.org/InStock" : "https://schema.org/OutOfStock",
},
};
return <script type="application/ld+json" dangerouslySetInnerHTML={{ __html: JSON.stringify(data).replace(/</g, "\\u003c") }} />;
}Önerilen şemalar: ürün sayfasında Product + BreadcrumbList, blog yazısında Article (ya da BlogPosting), ana sayfada Organization + WebSite, SSS bölümünde FAQPage. Değerleri her zaman vitrin API’sinin döndüğü gerçek veriden üretin; < karakterini kaçırın.
Görseller ve performans#
- Görselleri
TecofPictureile basın; boyut varyantları ve odak noktası otomatik uygulanır (Yayın render’ı). Anlamlıaltmetni verin. - Hero görselinde
loading="eager"ve Next.jsImageilepriority; diğerlerinde tembel yükleme. - Studio stil CSS’i sayfa başına yalnız kullanılan sınıflarla üretilir; ek CSS yükü getirmez.
SEO kontrol listesi#
- Sayfa başlığı ve açıklaması her yayın sayfasında dolu; ürün/CMS şablonlarında token’larla.
- OG görseli tanımlı; görseller
TecofPictureile vealtmetniyle. - Sayfa düzeyinde yalnız gerçekten gizlenecek sayfalar
noindex. - Mağazanın kendi alan adı birincil alan adı olarak seçili;
tecof.sitekapalı. -
sitemap.xmlverobots.txtcanlı host’ta doğru adresleri veriyor. - Çok dilli mağazada
hreflangalternatifleri basılıyor. - Ürün sayfalarında
ProductJSON-LD var. - Ürün beslemesi Merchant Center’a bağlı.