# Ürün Kategorileri

https://dev.wisecp.com/tr/urun-kategorileri

Bir grubun içindeki ürün kategorilerini okuyan, açan, düzenleyen, silen ve görsellerini yöneten altı uç.

## Genel Bakış

Kategori, bir grubun içinde ürünleri toplayan kaptır. Kategorilerin **düz listesi** ürün uçları makalesindeki arama ucundan gelir; buradaki altı uç tek bir kategoriyi okur, açar, düzenler, siler ve görsellerini yönetir.

Kategoriler ile özel gruplar aynı tabloda yaşar ve **aynı şemayı** döndürür. Hangisine baktığınızı `is_category` alanından okursunuz.

## Referans

### Kategori Detayı

get/api/v1/admin/products/categories/{id}

`Products/GetProductCategory` admin

Tek bir kategoriyi tüm ayarları ve dil içeriğiyle döndürür.

Dönen alanlar data — 18

idintKategori kimliği.

kindstringBağlı olduğu grup tipi.

kind_idintÖzel grup kimliği. Sabit gruplarda 0.

parent_idintÜst kategorinin kimliği. 0 üst seviye demektir.

is_categoryboolBu satır kategori mi, yoksa üst seviye grup mu.

group_keystring | nullÜst seviye gruplarda grup anahtarı.

statusstring`active` ya da `inactive`.

visibilitystring`visible` ya da `invisible`.

rankintGörüntülenme sırası.

icon_typestring`font` ya da `image`.

iconstringİkon sınıfı ya da yüklenen görselin adı.

colorstringKategori rengi.

list_templateintListe şablonunun kimliği.

upgradingboolYükseltmeye izin verilir mi.

seo_indexboolArama motorlarına açık mı.

enabled_payment_gatewaysarrayYalnız bu ödeme yollarına izin verir.

disabled_payment_gatewaysarrayBu ödeme yollarını kapatır.

langsobject 7 alanDil kodundan içerik nesnesine eşleme.

titlestringKategori başlığı.

routestringAdres parçası. Verilmezse başlıktan üretilir.

sub_titlestringAlt başlık.

contentstringKategori metni.

seo_titlestringArama başlığı.

seo_keywordsstringArama anahtar kelimeleri.

seo_descriptionstringArama açıklaması.

Hatalar 2

not_found404Kategori bulunamadı.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

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

```bash
curl 'https://panel.ornek.com/api/v1/admin/products/categories/18' \
  -H "Authorization: Bearer $API_KEY"
```

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

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

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

```php
$response = Api::Products()->GetProductCategory(['id' => 18]);

// is_category, satirin kategori mi ust seviye grup mu oldugunu soyler.
$isCategory = $response['data']['is_category'];
```

### Kategori Oluşturma

post/api/v1/admin/products/categories

`Products/CreateProductCategory` admin 201

Bir grubun içinde kategori açar. Hangi gruba gireceğini tek bir alan belirler.

Gövde 12

groupstringzorunluGrup bağlamı: `hosting`, `server`, `software` ya da özel grup için kimlik son ekli anahtar. Grup listesi ucundan alınır.

titleobjectzorunluDil kodundan başlığa eşleme. Geçerli dilin başlığı olmalı.

parent_idintÜst kategorinin kimliği.

rankintGörüntülenme sırası.

statusstring`active` ya da `inactive`.

sub_titlestringAlt başlık.

contentstringKategori metni.

routestringAdres parçası.

icon_typestring`font` ya da `image`.

iconstringİkon sınıfı.

colorstringKategori rengi.

seo_titlestringArama başlığı, anahtar kelimeleri ve açıklaması ayrı alanlardır.

Dönen alanlar data

dataobjectOluşturulan kategori, `201` ile döner. Yukarıdaki kategori detayıyla aynı şemadır.

Hatalar 5

title_required422Geçerli dilde başlık yok.

group_required422`group` boş.

route_exists422Adres parçası başka bir kayıtta kullanılıyor.

sub_title_too_long422Bir `sub_title` değeri 255 karakterden uzun.

create_failed422Oluşturma reddedildi.

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/products/categories' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"group":"hosting","title":{"en":"Reseller Hosting"},"rank":2}'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/products/categories', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    group: 'hosting',
    title: { en: 'Reseller Hosting' },
    rank: 2,
  }),
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/products/categories');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'group' => 'hosting',
        'title' => ['en' => 'Reseller Hosting'],
        'rank'  => 2,
    ]),
]);

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

```php
// Ozel grup icin anahtar kimlik son ekiyle gelir; grup listesinden okuyun.
$response = Api::Products()->CreateProductCategory([
    'group' => 'special-5',
    'title' => ['en' => 'Wildcard Certificates'],
]);
```

### Kategoriyi Güncelleme

patch/api/v1/admin/products/categories/{id}

`Products/UpdateProductCategory` admin kısmi güvenli

Gönderdiğiniz alanları uygular. Kategorinin bağlı olduğu grup bu uçtan değiştirilemez.

Gövde 11

titleobjectDil kodundan başlığa eşleme.

parent_idintÜst kategorinin kimliği.

rankintGörüntülenme sırası.

statusstring`active` ya da `inactive`.

sub_titlestringAlt başlık.

contentstringKategori metni.

routestringAdres parçası.

icon_typestring`font` ya da `image`.

iconstringİkon sınıfı.

colorstringKategori rengi.

seo_titlestringArama başlığı, anahtar kelimeleri ve açıklaması ayrı alanlardır.

Dönen alanlar data

dataobjectKategorinin son hâli, `200` ile döner. Yukarıdaki kategori detayıyla aynı şemadır.

Hatalar 4

not_found404Kategori bulunamadı.

route_exists422Adres parçası başka bir kayıtta kullanılıyor.

sub_title_too_long422Bir `sub_title` değeri 255 karakterden uzun.

update_failed422Güncelleme reddedildi.

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/products/categories/18' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"status":"inactive","rank":5}'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/products/categories/18', {
  method: 'PATCH',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ status: 'inactive', rank: 5 }),
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/products/categories/18');
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', 'rank' => 5]),
]);

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

```php
$response = Api::Products()->UpdateProductCategory([
    'id'     => 18,
    'status' => 'inactive',
    'rank'   => 5,
]);
```

### Kategoriyi Silme

delete/api/v1/admin/products/categories/{id}

`Products/DeleteProductCategory` admin geri alınamaz

Kategoriyi siler.

Dönen alanlar data — 2

deletedboolSilme başarılı mı.

idintSilinen kategorinin kimliği.

Hatalar 3

not_found404Kategori bulunamadı.

blocked_by_gate422`gate:product.group_delete` kancası işlemi veto etti.

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/products/categories/18' \
  -H "Authorization: Bearer $API_KEY"
```

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

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/products/categories/18');
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
$response = Api::Products()->DeleteProductCategory(['id' => 18]);
```

### Kategori Görseli Yükleme

post/api/v1/admin/products/categories/{id}/image

`Products/UploadCategoryImage` admin iki yuva

Kategorinin ikonunu ya da başlık arka planını yükler.

Gövde 2

imagestringzorunluGörsel. base64 veri adresi ya da indirilebilir bir bağlantı.

typestringHangi yuvaya yükleneceği: `icon` ya da `header-background`. Varsayılan `icon`.

Dönen alanlar data — 2

typestringYazılan yuva: `icon` ya da `header-background`.

urlstringSaklanan görselin genel adresi. Dosya adı rastgeledir.

——Bir yuva tek görsel tutar: yeni yükleme öncekinin yerine geçer ve dosyasını siler.

Hatalar 5

not_found404Kategori bulunamadı.

file_required422Dosya alanı boş.

file_invalid422Dosya çözümlenemedi ya da tipi kabul edilmedi.

file_failed422Dosya saklanamadı.

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/products/categories/18/image' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"image":"https://cdn.example.com/icon.png","type":"icon"}'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/products/categories/18/image', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    image: 'https://cdn.example.com/icon.png',
    type: 'icon',
  }),
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/products/categories/18/image');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'image' => 'https://cdn.example.com/icon.png',
        'type'  => 'icon',
    ]),
]);

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

```php
// Gorsel ikon yuklemek ikon tipini de 'image' yapar; font ikonu artik gecerli degildir.
$response = Api::Products()->UploadCategoryImage([
    'id'    => 18,
    'image' => 'https://cdn.example.com/icon.png',
    'type'  => 'icon',
]);
```

### Kategori Görselini Silme

delete/api/v1/admin/products/categories/{id}/image

`Products/DeleteProductCategoryImage` admin

Kategorinin ikonunu ya da başlık arka planını kaldırır.

Sorgu parametreleri 1

typestringHangi yuvanın boşaltılacağı: `icon` ya da `header-background`. Varsayılan `icon`.

Dönen alanlar data — 3

deletedboolSilme başarılı mı.

idintKategori kimliği.

typestringBoşaltılan yuva.

Hatalar 2

not_found404Kategori bulunamadı.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

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

```bash
curl -X DELETE -G 'https://panel.ornek.com/api/v1/admin/products/categories/18/image' \
  -H "Authorization: Bearer $API_KEY" \
  -d type=header-background
```

```javascript
const url = new URL('https://panel.ornek.com/api/v1/admin/products/categories/18/image');
url.searchParams.set('type', 'header-background');

const res = await fetch(url, {
  method: 'DELETE',
  headers: { Authorization: `Bearer ${apiKey}` },
});

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

```php
$url = 'https://panel.ornek.com/api/v1/admin/products/categories/18/image?' . http_build_query(['type' => 'header-background']);

$ch = curl_init($url);
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
$response = Api::Products()->DeleteProductCategoryImage(['id' => 18], [
    'type' => 'header-background',
]);
```

## Tuzaklar

> **Grup bağlamı yalnız oluştururken verilir**
> 
> Kategorinin hangi gruba ait olduğu `group` alanıyla açılışta belirlenir ve **sonradan değiştirilemez**; güncelleme gövdesinde böyle bir alan yoktur. Kategoriyi başka bir gruba taşımak için yenisini açıp eskisini silmeniz gerekir.

> **Adres parçası tüm kayıtlarda benzersizdir**
> 
> Adres parçası çakışırsa hem oluşturma hem güncelleme reddedilir. Çakışma yalnız kardeş kategoriler arasında değil, kayıtlar arasında aranır: başka bir gruptaki aynı adlı kategori de sizi durdurur. Başlıktan üretilen adresler bu yüzden beklenmedik biçimde çakışabilir.

> **Görsel ikon font ikonunu geçersiz kılar**
> 
> İkon yuvasına görsel yüklemek ikon tipini görsele çevirir; daha önce ayarladığınız font ikonu kaydedilse de gösterilmez. Font ikonuna dönmek için görseli silip ikon tipini geri yazmanız gerekir.

## İlgili Makaleler

- [Ürün Uçları](https://dev.wisecp.com/tr/urun-uclari)
- [Özel Gruplar](https://dev.wisecp.com/tr/ozel-gruplar)
