# Özel Scriptlere Genel Bakış

Script sistemi ve çalışma anı
Kaynak: https://selwise.com/docs/custom-scripts/overview

Özel scriptler, belirli sayfalarda çalışan kendi JavaScript ve CSS kodunuzu Selwise üzerinden yönetmenizi sağlar: kod panelde durur, hangi sayfalarda çalışacağını bir yol kuralı belirler, sitenize deploy gerekmez.

## Panelde nerede

Sol menüde **Kanallar → Özel Scriptler** (Channels → Custom Scripts) (`/dashboard/scripts`). Üç koşul gerekir:

- Rol: yalnızca `admin`. `marketing` rolü satırı görmez, adresi yazsa da ana sayfaya döner.
- Kanal: yalnızca **web sitesi** kanalı. Uygulama kanalında satır yoktur, çünkü script bir `<script>` etiketiyle sayfaya enjekte edilir.
- Modül: **gerekmez**. Özel scriptler her hesaba dahildir (çekirdek özellik); yalnızca **yapay zekâyla yazmak** için AI Studio modülü ve AI kredisi gerekir.

## Neden Selwise üzerinden

| Avantaj | Açıklama |
|---|---|
| Deploy gerekmez | Panelden kaydedersiniz; sonraki sayfa yüklemesinde yeni kod çalışır |
| Sayfa hedefleme | Hangi yollarda çalışacağını kural ile belirlersiniz |
| Açma/kapama | Kodu silmeden devre dışı bırakırsınız |
| Değişiklik kaydı | Kim ne zaman değiştirdi [Denetim Kayıtları](/docs/operations/audit-logs)'nda görünür (kodun kendisi değil, bir parmak izi) |
| Ortak kod, kanala özel yerleşim | Bir script bir kez yazılır; her kanalda farklı yol kuralıyla eklenebilir |

## Ne zaman kullanılmaz

| Durum | Doğru yer |
|---|---|
| Widget içeriği | [Custom Widget](/docs/widgets/custom-widget) |
| Ürün sayfası içeriği | [Ürün Zenginleştirme](/docs/product-enrichment/overview) |
| Kart tasarımı | [Özel Kart Oluşturma](/docs/product-cards/creating) |
| Sitenizin kalıcı işlevi | Temanız |

Özel scriptler bir kaçış kapağıdır; ilk çözüm değil.

## Çalışma modeli

Bunu bilmek, "neden çalışmadı"yı çözer:

1. Sayfa yüklenince Selwise, geçerli yolu (`location.pathname`; sorgu dizesi ve `#` hariç) kanal anahtarıyla birlikte sorar: `GET /public/sites/KANAL_ANAHTARI/scripts?path=…`.
2. Yanıt, **etkin** olan ve yol kuralı eşleşen scriptleri döndürür.
3. Her script için önce CSS, `<head>` içine bir `<style>` olarak eklenir; sonra JavaScript, `<body>`'nin sonuna **klasik bir `<script>` etiketi** olarak yazılır.
4. Kod **tam sayfa yüklemesi başına bir kez** çalışır.

Sonuçları:

- Kod **bir fonksiyona sarılmaz**: üst düzey `const`/`var` global olur ve **üst düzey `return` söz dizimi hatasıdır**. Kodunuzu kendiniz `(function () { … })();` ile sarın.
- `import`/`export` (modül) çalışmaz.
- **Zamanlama seçeneği yoktur** (`immediate`, `domReady` gibi). Kod, Selwise başladıktan sonra çalışır; temanızın DOM'u o anda tamamlanmamış olabilir — elemanı bekleyin (`MutationObserver` ya da `DOMContentLoaded`).
- **Tek sayfa uygulamasında** (route değişimi sayfayı yenilemeyen mağaza) kod yeniden çalışmaz. Selwise yol değişince enjekte edilen `<script>` ve `<style>` öğelerini kaldırır ama **yapılan işi geri almaz** (eklenmiş dinleyiciler ve DOM düğümleri kalır) ve scripti **yeniden çalıştırmaz**. Sonuç: CSS ilk gezintiden sonra kalkar. Rota değişimini kendiniz izleyin — bkz. [Sayfa Hedefleme](/docs/custom-scripts/targeting#tek-sayfa-uygulamaları).
- **Test modu yoktur.** Script test moduna bağlanmaz: etkin ve yolu eşleşen her ziyaretçide çalışır. Önce tarayıcı konsolunda deneyin; panelde **Preview** (Önizleme) yalnızca örnek bir sayfada çalıştırır.

## Güvenlik ve sınırlar

| Konu | Davranış |
|---|---|
| Kimlik | Script yalnızca **doğrulanmış** bir kanalda ve geçerli `Origin` ile sunulur; abonelik teslimata açık olmalıdır. Doğrulanmamış kanalda script de çalışmaz. |
| Çerez onayı | **Hiçbir şey onaya bağlı değildir.** Selwise script'i onay beklemeden enjekte eder; çerez ya da yerel depolama kullanıyorsanız kodunuz önce `window.Selwise.getConsentState()` ile izni kontrol etmelidir — bkz. [Onay Yönetimi](/docs/integration/consent). |
| Yetki | Kod sayfayla **aynı yetkiyle** çalışır: ödeme sayfası dahil sayfadaki her şeyi okuyabilir. Kişisel veri okumayın, üçüncü tarafa göndermeyin. |
| CSP | Script satır içi (`inline`) enjekte edilir. Sitenizin `Content-Security-Policy` başlığı satır içi scripti yasaklıyorsa (nonce/hash olmadan) tarayıcı onu engeller; konsolda CSP hatası görürsünüz. Çözüm sitenizin politikasındadır. |
| Boyut | JavaScript en fazla 50.000, CSS en fazla 30.000, açıklama en fazla 1.000, ad en fazla 100, yol deseni en fazla 255 karakterdir. Aşan alan kayıtta adıyla reddedilir (`400`). |
| Sayı | Özel script sayınız sözleşmedeki **Custom scripts** stok limitiyle sınırlıdır; dolunca yeni script oluşturulamaz (`409`). |
| Hata | Script'in kendi çalışma zamanı hataları tarayıcı konsoluna düşer ve sayfayı bozmamalıdır; kodunuz `try/catch` içinde olmalıdır. Enjeksiyon sırasında yakalanan hata `script_error` olayı olarak kaydedilir; başarılı enjeksiyon `script_injected` olarak. |

## Sırada ne var

- [Script Ekleme](/docs/custom-scripts/adding)
- [Sayfa Hedefleme](/docs/custom-scripts/targeting)
- [Örnekler](/docs/custom-scripts/examples)
- Çalışmıyorsa: [Özel Script Sorunları](/docs/troubleshooting/common-issues#özel-script-çalışmıyor)
