# Site Sayfaları

https://dev.wisecp.com/tr/site-sayfalari

Sayfa, sözleşme, haber, blog ve referans içeriklerini yöneten yedi uç.

## Genel Bakış

Panelin **Sayfalar, Sözleşmeler, Haberler, Bloglar ve Referanslar** sekmelerinin hepsi tek bir içerik tipidir. Beşi de bu yedi uçtan yönetilir; aralarındaki tek fark gönderdiğiniz **tip** alanıdır.

İçerik **dil başına** tutulur: başlık, adres, gövde ve arama motoru alanları her dilde ayrı yaşar. Liste ucu geçerli dili verir, detay ucu hepsini; çeviri gerektiren her iş detaydan başlar.

Görseller ayrı uçlardan yüklenir ve **tür** ile adlandırılır. Hangi türün geçerli olduğu sayfanın tipine bağlıdır, bu yüzden aynı çağrı bir tipte çalışıp diğerinde reddedilebilir.

## Referans

### Sayfaları Listeleme

get/api/v1/admin/website/pages

`Website/GetPages` admin

Seçtiğiniz içerik tipindeki sayfaları döndürür.

Sorgu 4

typestringHangi içerik tipi: `normal`, `contract`, `news`, `articles`, `references`. Öntanımlı olarak düz sayfa.

searchstringBaşlıkta arar.

pageintKaçıncı sayfa.

limitintSayfa başına kayıt. En çok yüz.

Dönen alanlar data[] — 6 + meta — 5

idintSayfanın numarası.

typestringİçerik tipi.

titlestringGeçerli dildeki başlığı.

routestringGeçerli dildeki adresi.

categorystringKategorisinin adı.

created_atstringOluşturulma anı.

totalintToplam kayıt. Meta altında döner.

pageintBulunulan sayfa.

limitintSayfa boyutu.

type stringSüzülen içerik tipi.

next_pageintSonraki sayfa. Sıfır, son sayfadasınız demektir.

Hatalar 2

invalid_type422İçerik tipi tanınmıyor.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl 'https://panel.ornek.com/api/v1/admin/website/pages?type=news&limit=25' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const url = new URL('https://panel.ornek.com/api/v1/admin/website/pages');
url.searchParams.set('type', 'news');

const res  = await fetch(url, {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/website/pages?' . http_build_query(['type' => 'news', 'limit' => 25]));
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Tip verilmezse yalniz DUZ sayfalar doner; haberler ayri bir listede degil, ayni ucta.
$news = Api::Website()->GetPages([], ['type' => 'news'])['data'];
```

### Sayfa Detayı

get/api/v1/admin/website/pages/{id}

`Website/GetPage` admin

Tek bir sayfayı bütün dilleri ve görselleriyle döndürür.

Dönen alanlar data — 12

idintSayfanın numarası.

typestringİçerik tipi: `normal`, `contract`, `news`, `articles`, `references`.

categoryintSayfanın kategorisi.

sidebarstringKenar çubuğu gösteriliyor mu.

statusstringSayfa yayında mı.

visibilitystring | nullListelerde görünürlüğü.

visible_to_userint | nullMüşteri panelinde görünüp görünmediği.

rankint | nullListedeki sırası.

optionsobjectTipe özgü seçenekler. Sözleşme seçenekleri ve arama motoru tercihi burada durur.

created_atstring | nullOluşturulma anı.

languagesobjectDil başına içerik: başlık, rota, gövde, arama motoru alanları ve referans tipinde ek metinler.

imagesobjectTür başına görsel adresi. O tipe uygun türler gelir.

Hatalar 2

page_not_found404Sayfa bulunamadı.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl 'https://panel.ornek.com/api/v1/admin/website/pages/5' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res  = await fetch(`https://panel.ornek.com/api/v1/admin/website/pages/${id}`, {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/website/pages/' . $id);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Liste TEK DIL verir, detay HEPSINI; ceviri gerektiren her is detaydan baslar.
$page = Api::Website()->GetPage(['id' => $id])['data'];
$en   = $page['languages']['en'] ?? null;
```

### Sayfa Oluşturma

post/api/v1/admin/website/pages

`Website/CreatePage` admin tip sonradan değişmez

Yeni bir sayfa açar ve dillerini yazar.

Gövde 15

typestringreqİçerik tipi: `normal`, `contract`, `news`, `articles`, `references`. Sonradan değiştirilemez.

languagesobjectreqDil başına içerik: başlık, rota, gövde ve arama motoru alanları. Gönderdiğiniz her dilde başlık gerekir.

statusstringSayfa yayında mı. Öntanımlı olarak yayında.

sidebarstringKenar çubuğu gösterilsin mi.

categoryintSayfanın kategorisi.

seo_indexintArama motorlarının sayfayı dizine almasına izin verir.

imagesobjectAynı istekte yüklenecek görseller. Tipe uymayan bir tür çağrıyı düşürür.

show_during_account_registrationintKayıt sırasında gösterilir. Sözleşme tipine özgü.

show_during_purchaseintSatın alma sırasında gösterilir. Sözleşme tipine özgü.

show_in_account_preferencesintHesap tercihlerinde gösterilir. Sözleşme tipine özgü.

mandatory_account_preferencesintHesap tercihlerinde onay zorunlu olur. Sözleşme tipine özgü.

visibilitystringSayfanın listelerde görünürlüğü. Haber ve referans tiplerinde işler.

visible_to_userintMüşteri panelinde de görünür. Haber tipine özgü.

rankintListedeki sırası. Referans tipine özgü.

websitestringReferansın adresi. Referans tipine özgü.

Dönen alanlar 201 — data — 12

dataobjectOluşan sayfa. Detay ucuyla aynı şekildedir.

Hatalar 7

invalid_type422İçerik tipi tanınmıyor.

languages_required422Hiç dil gönderilmedi.

title_required422Bir dilde başlık boş.

route_exists422Bu adres o dilde zaten kullanılıyor.

invalid_kind422Görsel türü bu tipe uymuyor.

create_failed500Sayfa oluşturulamadı.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl -X POST 'https://panel.ornek.com/api/v1/admin/website/pages' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"type":"normal","languages":{"tr":{"title":"Hakkimizda","content":"<p>Merhaba</p>"}}}'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/website/pages', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    type: 'normal',
    languages: {
      en: { title: 'About Us', content: '<p>Hello</p>' },
    },
  }),
});

const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/website/pages');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'type'      => 'normal',
        'languages' => ['en' => ['title' => 'About Us', 'content' => '<p>Hello</p>']],
    ]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Adres verilmezse basliktan uretilir; ayni dilde carpisirsa cagri 422 ile doner.
Api::Website()->CreatePage([
    'type'      => 'news',
    'languages' => ['en' => ['title' => 'Maintenance notice']],
]);
```

### Sayfayı Güncelleme

patch/api/v1/admin/website/pages/{id}

`Website/UpdatePage` admin

Sayfanın gönderdiğiniz alanlarını ve dillerini değiştirir.

Gövde 14

languagesobjectreqDil başına içerik: başlık, rota, gövde ve arama motoru alanları. Gönderdiğiniz her dilde başlık gerekir.

statusstringSayfa yayında mı. Öntanımlı olarak yayında.

sidebarstringKenar çubuğu gösterilsin mi.

categoryintSayfanın kategorisi.

seo_indexintArama motorlarının sayfayı dizine almasına izin verir.

imagesobjectAynı istekte yüklenecek görseller. Tipe uymayan bir tür çağrıyı düşürür.

show_during_account_registrationintKayıt sırasında gösterilir. Sözleşme tipine özgü.

show_during_purchaseintSatın alma sırasında gösterilir. Sözleşme tipine özgü.

show_in_account_preferencesintHesap tercihlerinde gösterilir. Sözleşme tipine özgü.

mandatory_account_preferencesintHesap tercihlerinde onay zorunlu olur. Sözleşme tipine özgü.

visibilitystringSayfanın listelerde görünürlüğü. Haber ve referans tiplerinde işler.

visible_to_userintMüşteri panelinde de görünür. Haber tipine özgü.

rankintListedeki sırası. Referans tipine özgü.

websitestringReferansın adresi. Referans tipine özgü.

Dönen alanlar data — 12

dataobjectGüncel sayfa. Detay ucuyla aynı şekildedir.

Hatalar 5

page_not_found404Sayfa bulunamadı.

title_required422Bir dilde başlık boşaltıldı.

route_exists422Bu adres o dilde zaten kullanılıyor.

invalid_kind422Görsel türü bu tipe uymuyor.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl -X PATCH 'https://panel.ornek.com/api/v1/admin/website/pages/5' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"status":"inactive","languages":{"tr":{"title":"Sirketimiz"}}}'
```

```javascript
const res = await fetch(`https://panel.ornek.com/api/v1/admin/website/pages/${id}`, {
  method: 'PATCH',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    status: 'inactive',
    languages: { en: { title: 'About Our Company' } },
  }),
});

const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/website/pages/' . $id);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'PATCH',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'status'    => 'inactive',
        'languages' => ['en' => ['title' => 'About Our Company']],
    ]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Yalniz gonderilen dil yazilir, digerleri KORUNUR; tip alani yoksayilir.
Api::Website()->UpdatePage([
    'id'        => $id,
    'languages' => ['en' => ['title' => 'About Our Company']],
]);
```

### Sayfayı Silme

delete/api/v1/admin/website/pages/{id}

`Website/DeletePage` admin

Sayfayı bütün dilleriyle kaldırır.

Dönen alanlar data — 2

deletedboolSilme çalıştı mı.

idintSilinen sayfanın numarası.

Hatalar 3

page_not_found404Sayfa bulunamadı.

blocked_by_gate422Bir kanca silmeyi reddetti.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl -X DELETE 'https://panel.ornek.com/api/v1/admin/website/pages/5' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res = await fetch(`https://panel.ornek.com/api/v1/admin/website/pages/${id}`, {
  method: 'DELETE',
  headers: { Authorization: `Bearer ${apiKey}` },
});

const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/website/pages/' . $id);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'DELETE',
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Yayindan kaldirmak icin silmek yerine DURUMU kapatin: adres ve gecmis korunur.
Api::Website()->UpdatePage(['id' => $id, 'status' => 'inactive']);
```

### Sayfa Görseli Yükleme

put/api/v1/admin/website/pages/{id}/images/{kind}

`Website/UploadPageImage` admin

Bir sayfa görselini yükler ve öncekinin yerine koyar.

Yol 2

idintSayfanın numarası.

kindstringGörsel türü: `header-background`, `cover`, `mockup`. Kapak türü haber, blog ve referansta; maket türü ise referansta geçerli.

Gövde 1

imagestringreqYüklenecek görsel. Adres ya da gömülü veri olarak verilebilir.

Dönen alanlar 201 — data — 2

kindstringYüklenen görselin türü.

urlstringGörselin genel adresi.

Hatalar 3

page_not_found404Sayfa bulunamadı.

invalid_kind422Görsel türü bu tipe uymuyor.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl -X PUT 'https://panel.ornek.com/api/v1/admin/website/pages/5/images/header-background' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"image":"https://ornek.com/afis.jpg"}'
```

```javascript
const res = await fetch(`https://panel.ornek.com/api/v1/admin/website/pages/${id}/images/header-background`, {
  method: 'PUT',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ image: 'https://example.com/banner.jpg' }),
});

const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/website/pages/' . $id . '/images/header-background');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'PUT',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['image' => 'https://example.com/banner.jpg']),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Kapak ve maket turleri kucuk resmi de URETIR; afis turu tek dosya birakir.
Api::Website()->UploadPageImage([
    'id' => $id, 'kind' => 'cover', 'image' => $data,
]);
```

### Sayfa Görselini Kaldırma

delete/api/v1/admin/website/pages/{id}/images/{kind}

`Website/DeletePageImage` admin

Bir sayfa görselini ve varsa küçük resmini kaldırır.

Yol 2

idintSayfanın numarası.

kindstringKaldırılacak görsel türü: `header-background`, `cover`, `mockup`.

Dönen alanlar data — 3

deletedboolSilme çalıştı mı.

idintSayfanın numarası.

kindstringKaldırılan görsel türü.

Hatalar 3

page_not_found404Sayfa bulunamadı.

invalid_kind422Görsel türü bu tipe uymuyor.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl -X DELETE 'https://panel.ornek.com/api/v1/admin/website/pages/5/images/header-background' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res = await fetch(`https://panel.ornek.com/api/v1/admin/website/pages/${id}/images/header-background`, {
  method: 'DELETE',
  headers: { Authorization: `Bearer ${apiKey}` },
});

const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/website/pages/' . $id . '/images/header-background');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'DELETE',
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Gorseli DEGISTIRMEK icin once silmeye gerek yok; yukleme zaten yerine koyar.
Api::Website()->DeletePageImage(['id' => $id, 'kind' => 'cover']);
```

## Tuzaklar

> **Tip oluşturma anında seçilir**
> 
> İçerik tipi kaydın kimliğinin bir parçasıdır ve **güncelleme onu yoksayar**. Düz sayfa olarak açılmış bir kaydı habere çeviremezsiniz; doğru tiple yeniden oluşturup eskisini kaldırmanız gerekir. Tip yanlış girildiğinde bu, adresin ve görsellerin de yeniden kurulması demektir.

> **Adres dil başına benzersizdir**
> 
> Aynı adres **farklı dillerde** yan yana durabilir, ama tek bir dilde iki sayfa aynı adresi taşıyamaz. Çakışma hatası hangi dilde olduğunu söyler. Adres göndermezseniz başlıktan üretilir; benzer başlıklı iki haber bu yüzden beklenmedik bir çakışma yaratabilir.

> **Görsel türü sayfa tipine bağlıdır**
> 
> Afiş görseli her tipte geçerlidir; **kapak** haber, blog ve referansta, **maket** ise referansta kabul edilir. Uymayan bir tür 422 ile döner. Bu sayfa oluştururken de geçerlidir: gövdeye konan geçersiz bir görsel türü sayfanın hiç oluşmamasına yol açar.

> **Tipe ait alanlar diğerlerinde sessizce durur**
> 
> Sözleşmenin onay seçenekleri, haberin müşteri panelinde görünmesi ve referansın sırası ile adresi kendi tiplerinde iş görür. Başka bir tipte gönderilirse **hata alınmaz**, değer de bir işe yaramaz. Beklediğiniz davranış çıkmıyorsa önce kaydın tipini doğrulayın.

> **Güncelleme dilleri birleştirir**
> 
> Güncellemede gönderdiğiniz diller yazılır, **göndermedikleriniz korunur**. Yani tek bir dili düzeltmek için diğerlerini taşımanız gerekmez. Bu, sitenin diğer bazı yazma uçlarından farklıdır; oralarda gövde tanımın tamamı sayılır ve eksik bırakılan silinir.

## İlgili Makaleler

- [Site Kategorileri](https://dev.wisecp.com/tr/site-kategorileri)
- [Site Menüleri](https://dev.wisecp.com/tr/site-menuleri)
- [Ana Sayfa Slaytları](https://dev.wisecp.com/tr/ana-sayfa-slaytlari)
