Yardım Kategorileri

1.6k görüntülenme Markdown

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 'https://panel.ornek.com/api/v1/admin/knowledgebase/categories' \
  -H "Authorization: Bearer $API_KEY"
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]));
$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);
// 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
translationsobjectreqDil 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 -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"}}}'
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();
$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);
// 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ı.
translationsobjectDil 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 'https://panel.ornek.com/api/v1/admin/knowledgebase/categories/3' \
  -H "Authorization: Bearer $API_KEY"
const res = await fetch(`https://panel.ornek.com/api/v1/admin/knowledgebase/categories/${cid}`, {
  headers: { Authorization: `Bearer ${apiKey}` },
});

const { data } = await res.json();
$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);
// 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
translationsobjectreqDil 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 -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"}}}'
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 }),
});
$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);
// 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 -X DELETE 'https://panel.ornek.com/api/v1/admin/knowledgebase/categories/3' \
  -H "Authorization: Bearer $API_KEY"
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();
$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);
// 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.

Faydalı oldu mu?

Geri bildiriminiz için teşekkürler!

Hâlâ Yardıma mı İhtiyacınız Var?

Yukarıda bulamadığınız her şey için destek ekibimiz her zaman yanınızda.