# Yardım Kategorileri

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

Yardım kategorilerini açan, okuyan, güncelleyen ve kaldıran beş uç.

## Genel Bakış

Kategoriler yardım makalelerini gruplar ve **ağaç kurar**: her kategori bir üst kategoriye bağlanabilir, kök olanların üstü sıfırdır.

Makalelerle aynı sözleşmeyi taşırlar: başlık her etkin dilde zorunlu, adres parçası isteğe bağlı ve dil başına benzersiz, güncelleme ise tam yazım.

Bir fark vardır: kategorinin arama motoru alanları **indeksleme açıkken** saklanır. Kapalıyken doldurulan alanlar kaydedilmez.

## Referans

### Kategorileri Listeleme

get/api/v1/admin/knowledgebase/categories

`Knowledgebase/GetKnowledgebaseCategories` admin

Yardım kategorilerini döndürür.

Sorgu 3

searchstringBaşlıkta arar.

pageintKaçıncı sayfa.

limitintSayfa başına kayıt. En çok 100.

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

idintKategorinin numarası.

titlestringBaşlık. Panelin geçerli dilinde gelir.

routestringAdres parçası.

statusstringKategori açık mı.

iconstringSimge sınıfı.

totalintToplam kategori. Meta altında döner.

pageintBulunulan sayfa.

limitintSayfa boyutu.

Hatalar 1

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

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

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

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

const { data } = await res.json();
const byId = Object.fromEntries(data.map((c) => [c.id, c.title]));
```

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

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

```php
// Listede UST KATEGORI numarasi YOKTUR: agaci kurmak icin her kategorinin detayi gerekir.
$rows = Api::Knowledgebase()->GetKnowledgebaseCategories()['data'];
foreach ($rows as $c)
    $parent[$c['id']] = Api::Knowledgebase()->GetKnowledgebaseCategory(['cid' => $c['id']])['data']['parent_id'];
```

### Kategori Açma

post/api/v1/admin/knowledgebase/categories

`Knowledgebase/CreateKnowledgebaseCategory` admin her dil gerekir

Yeni bir yardım kategorisi açar.

Gövde 6

translationsobjectreq translations.Dil başına içerik. Her etkin dilde başlık gerekir.

titlestringKategori başlığı. Her etkin dilde gerekir.

routestringAdres parçası. Boş bırakılırsa başlıktan türetilir.

sub_titlestringAlt başlık.

contentstringKategori açıklaması.

seo_titlestringArama motoru başlığı. Arama motoru alanları indeksleme açıkken saklanır.

seo_keywordsstringArama motoru anahtar kelimeleri.

seo_descriptionstringArama motoru açıklaması.

parent_idintÜst kategorinin numarası. Sıfır kök demektir.

statusstringKategori açık mı.

rankintListedeki sırası.

iconstringSimge sınıfı.

seo_indexboolArama motoru alanları saklansın ve indekslensin mi.

Dönen alanlar 201 — data — 7

dataobjectOluşan kategori. Okuma ucuyla aynı şekildedir; yeni numara meta altında da gelir.

Hatalar 5

title_required422Etkin dillerden birinde başlık eksik.

route_in_use422Adres parçası o dilde başka bir kategoride kullanılıyor.

invalid_parent422Bir kategori kendi üstü olamaz.

vetoed422Bir kanca kaydı reddetti.

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/knowledgebase/categories' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"parent_id":0,"icon":"bi bi-book","translations":{"en":{"title":"Billing"}}}'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/knowledgebase/categories', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    parent_id: 0,
    icon: 'bi bi-book',
    seo_index: true,
    translations: { en: { title: 'Billing', sub_title: 'Invoices and payments' } },
  }),
});

const { data, meta } = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/knowledgebase/categories');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'parent_id' => 0, 'translations' => ['en' => ['title' => 'Billing']],
    ]),
]);

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

```php
// Arama motoru alanlari indeksleme KAPALIYKEN saklanmaz: doldursaniz da kaybolurlar.
Api::Knowledgebase()->CreateKnowledgebaseCategory([
    'seo_index' => true,
    'translations' => ['en' => ['title' => 'Billing', 'seo_title' => 'Billing help']],
]);
```

### Kategoriyi Okuma

get/api/v1/admin/knowledgebase/categories/{cid}

`Knowledgebase/GetKnowledgebaseCategory` admin

Kategoriyi bütün dilleriyle döndürür.

Dönen alanlar data — 7

idintKategorinin numarası.

parent_idintÜst kategorinin numarası.

statusstringKategori açık mı.

rankintListedeki sırası.

iconstringSimge sınıfı.

seo_indexboolArama motoru indekslemesi açık mı.

translationsobject translations.Dil başına içerik.

titlestringKategori başlığı. Her etkin dilde gerekir.

routestringAdres parçası. Boş bırakılırsa başlıktan türetilir.

sub_titlestringAlt başlık.

contentstringKategori açıklaması.

seo_titlestringArama motoru başlığı. Arama motoru alanları indeksleme açıkken saklanır.

seo_keywordsstringArama motoru anahtar kelimeleri.

seo_descriptionstringArama motoru 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/knowledgebase/categories/3' \
  -H "Authorization: Bearer $API_KEY"
```

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

const { data } = await res.json();
```

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

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

```php
// Ust kategori numarasi YALNIZ burada gelir; agac kurarken bu ucu her kategori icin cagirin.
$c = Api::Knowledgebase()->GetKnowledgebaseCategory(['cid' => $cid])['data'];
$isRoot = (int) $c['parent_id'] === 0;
```

### Kategoriyi Güncelleme

patch/api/v1/admin/knowledgebase/categories/{cid}

`Knowledgebase/UpdateKnowledgebaseCategory` admin tam yazım

Kategorinin tamamını yeniden yazar.

Gövde 6

translationsobjectreq translations.Dil başına içerik. Set yeniden yazılır; göndermediğiniz dil kaybolur.

titlestringKategori başlığı. Her etkin dilde gerekir.

routestringAdres parçası. Boş bırakılırsa başlıktan türetilir.

sub_titlestringAlt başlık.

contentstringKategori açıklaması.

seo_titlestringArama motoru başlığı. Arama motoru alanları indeksleme açıkken saklanır.

seo_keywordsstringArama motoru anahtar kelimeleri.

seo_descriptionstringArama motoru açıklaması.

parent_idintÜst kategorinin numarası. Sıfır kök demektir.

statusstringKategori açık mı.

rankintListedeki sırası.

iconstringSimge sınıfı.

seo_indexboolArama motoru alanları saklansın ve indekslensin mi.

Dönen alanlar data — 7

dataobjectGüncel kategori. Okuma ucuyla aynı şekildedir.

Hatalar 6

not_found404Kategori bulunamadı.

title_required422Etkin dillerden birinde başlık eksik.

route_in_use422Adres parçası o dilde başka bir kategoride kullanılıyor.

invalid_parent422Bir kategori kendi üstü olamaz.

vetoed422Bir kanca kaydı reddetti.

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/knowledgebase/categories/3' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"status":"inactive","translations":{"en":{"title":"Billing"}}}'
```

```javascript
const cur = await fetch(`https://panel.ornek.com/api/v1/admin/knowledgebase/categories/${cid}`, {
  headers: { Authorization: `Bearer ${apiKey}` },
}).then((r) => r.json());

const res = await fetch(`https://panel.ornek.com/api/v1/admin/knowledgebase/categories/${cid}`, {
  method: 'PATCH',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ ...cur.data, rank: 2 }),
});
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/knowledgebase/categories/' . $cid);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'PATCH',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode($category),
]);

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

```php
// Kategoriyi kapatmak makaleleri SILMEZ ama musteri onlara kategoriden ulasamaz.
$c = Api::Knowledgebase()->GetKnowledgebaseCategory(['cid' => $cid])['data'];
$c['status'] = 'inactive';

Api::Knowledgebase()->UpdateKnowledgebaseCategory($c + ['cid' => $cid]);
```

### Kategoriyi Silme

delete/api/v1/admin/knowledgebase/categories/{cid}

`Knowledgebase/DeleteKnowledgebaseCategory` admin

Kategoriyi ve bütün çevirilerini siler.

Dönen alanlar data — 2

deletedboolSilme çalıştı mı.

idintSilinen kategorinin numarası.

Hatalar 3

not_found404Kategori bulunamadı.

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

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

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/knowledgebase/categories/' . $cid);
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
// Icindeki makaleler KALIR ve kategorisiz duser; once onlari baska bir kategoriye tasiyin.
$arts = Api::Knowledgebase()->GetKnowledgebaseArticles()['data'];
foreach ($arts as $a) { /* kategorisi $cid olanlari tasiyin */ }

Api::Knowledgebase()->DeleteKnowledgebaseCategory(['cid' => $cid]);
```

## Tuzaklar

> **Liste ağacı kurmaya yetmez**
> 
> Kategori listesi üst kategori numarasını **taşımaz**; geriye numara, başlık, adres, durum ve simge kalır. Ağaç kurmak için her kategoriyi ayrı ayrı okumanız gerekir. Büyük bir bilgi bankasında bu, kategori sayısı kadar çağrı demektir.

> **Güncelleme çeviri setini yeniden yazar**
> 
> Makalelerde olduğu gibi güncelleme gövdesi **kategorinin tamamıdır**. Tek başına sırayı değiştirmek için bile önce mevcut hâli okuyup üzerine yazmalısınız; aksi hâlde göndermediğiniz diller ve alanlar boşalır.

> **Arama motoru alanları kapalıyken kaydedilmez**
> 
> Arama motoru başlığı, anahtar kelimeleri ve açıklaması **indeksleme açıkken** kalıcı olur. Kapalıyken bu alanları doldurmak hata vermez, ama değerler kaydedilmez ve bir sonraki okumada boş görünür. Önce indekslemeyi açın.

> **Kategoriyi silmek makaleleri öksüz bırakır**
> 
> Kategori silindiğinde içindeki makaleler **silinmez**; kategorisiz kalırlar ve müşteri onlara kategori listesinden ulaşamaz. Makaleler hâlâ adreslerinden ve aramadan bulunur, ama gezinme kırılır. Silmeden önce makaleleri taşıyın.

> **Kendi üstü olma denetimi tek adımlıktır**
> 
> Bir kategorinin üstü kendisi olamaz ve bu denetlenir. Daha uzun halkalar (A üstü B, B üstü A) için **aynı güvence yoktur**; ağacı yeniden düzenlerken döngü kurmamaya kendiniz dikkat edin.

## İlgili Makaleler

- [Yardım Makaleleri](https://dev.wisecp.com/tr/yardim-makaleleri)
- [Başvuru Listeleri](https://dev.wisecp.com/tr/basvuru-listeleri)
