# Müşteri Yorumları

https://dev.wisecp.com/tr/musteri-yorumlari

Sitede gösterilen müşteri yorumlarını ekleyen, onaylayan ve kaldıran yedi uç.

## Genel Bakış

Müşteri yorumları sitede gösterilen referans metinleridir. Her yorumun bir **durumu** vardır: beklemede, onaylı ya da reddedilmiş. Sitede **yalnızca onaylı** olanlar görünür.

Yorum metni **dil başına** tutulur; ad, firma ve avatar ise ortaktır. Ziyaretçinin gönderdiği kayıtlar beklemede başlar ve bir yönetici onaylayana kadar sitede yer almaz.

Bu uçlar aynı zamanda **panel üzerinden yorum eklemeyi** de sağlar: kâğıtta ya da e-postada gelen bir referansı elle girip doğrudan onaylı oluşturabilirsiniz.

## Referans

### Yorumları Listeleme

get/api/v1/admin/website/cfeedbacks

`Website/GetCfeedbacks` admin

Sitede yayınlanan müşteri yorumlarını döndürür.

Sorgu 3

searchstringAd, firma, e-posta ve gönderim adresinde arar.

pageintKaçıncı sayfa.

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

Dönen alanlar data[] — 7 + meta — 4

idintYorumun numarası.

full_namestringYorumu bırakanın adı.

company_namestringKişinin firması.

emailstringE-posta adresi.

statusstringYorumun durumu: `pending`, `approved`, `rejected`.

rankintListedeki sırası.

created_atstring | nullGönderilme anı.

totalintToplam yorum. Meta altında döner.

pageintBulunulan sayfa.

limitintSayfa boyutu.

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

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/website/cfeedbacks' \
  -H "Authorization: Bearer $API_KEY"
```

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

const waiting = data.filter((f) => f.status === 'pending');
```

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

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

```php
// Durum SUZGECI yoktur; bekleyenleri gormek icin listeyi kendiniz ayiklayin.
$all     = Api::Website()->GetCfeedbacks()['data'];
$waiting = array_filter($all, fn ($f) => $f['status'] === 'pending');
```

### Yorum Detayı

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

`Website/GetCfeedback` admin

Tek bir yorumu metni ve avatarıyla döndürür.

Dönen alanlar data — 11

idintYorumun numarası.

full_namestringYorumu bırakanın adı.

company_namestringKişinin firması.

emailstringE-posta adresi.

statusstringYorumun durumu: `pending`, `approved`, `rejected`.

rankintListedeki sırası.

unreadintOkunmamış işareti. Onaylanan yorumda birdir.

ipstringYorumun geldiği adres.

created_atstring | nullGönderilme anı.

languagesobjectDil başına yorum metni.

picturestring | nullAvatarın adresi.

Hatalar 2

cfeedback_not_found404Yorum 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/cfeedbacks/4' \
  -H "Authorization: Bearer $API_KEY"
```

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

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

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

```php
// Yorum METNI ve gonderen ADRESI yalniz burada gelir; liste ikisini de tasimaz.
$fb = Api::Website()->GetCfeedback(['id' => $id])['data'];
$en = $fb['languages']['en']['message'] ?? '';
```

### Yorum Oluşturma

post/api/v1/admin/website/cfeedbacks

`Website/CreateCfeedback` admin

Panel üzerinden yeni bir müşteri yorumu ekler.

Gövde 7

full_namestringreqYorumu bırakanın adı.

languagesobjectreqDil başına yorum metni. Gönderdiğiniz her dilde metin gerekir.

company_namestringKişinin firması.

emailstringE-posta adresi. Sitede gösterilmez.

statusstringYorumun durumu: `pending`, `approved`, `rejected`. Öntanımlı olarak beklemede.

rankintListedeki sırası.

imagestringAynı istekte yüklenecek avatar.

Dönen alanlar 201 — data — 11

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

Hatalar 6

full_name_required422Ad boş.

languages_required422Hiç dil gönderilmedi.

message_required422Bir dilde metin boş.

invalid_status422Durum tanınmıyor.

create_failed500Yorum 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/cfeedbacks' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"full_name":"Ayse Yilmaz","status":"approved","languages":{"tr":{"message":"Harika hizmet!"}}}'
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/website/cfeedbacks', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    full_name: 'John Doe',
    company_name: 'Example Inc.',
    status: 'approved',
    languages: { en: { message: 'Great service!' } },
  }),
});

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/website/cfeedbacks');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'full_name' => 'John Doe',
        'status'    => 'approved',
        'languages' => ['en' => ['message' => 'Great service!']],
    ]),
]);

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

```php
// Durum vermezseniz yorum BEKLEMEDE dogar ve sitede gorunmez; onayi ayrica verin.
Api::Website()->CreateCfeedback([
    'full_name' => 'John Doe',
    'status'    => 'approved',
    'languages' => ['en' => ['message' => 'Great service!']],
]);
```

### Yorumu Güncelleme

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

`Website/UpdateCfeedback` admin onay buradan verilir

Yorumun durumunu, metnini ve bilgilerini değiştirir.

Gövde 7

full_namestringYorumu bırakanın adı. Göndermezseniz mevcut değer korunur.

languagesobjectreqDil başına yorum metni. Gönderdiğiniz her dilde metin gerekir.

company_namestringKişinin firması.

emailstringE-posta adresi. Sitede gösterilmez.

statusstringYorumun durumu: `pending`, `approved`, `rejected`. Öntanımlı olarak beklemede.

rankintListedeki sırası.

imagestringAynı istekte yüklenecek avatar.

Dönen alanlar data — 11

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

Hatalar 5

cfeedback_not_found404Yorum bulunamadı.

full_name_required422Ad boşaltıldı.

message_required422Bir dilde metin boşaltıldı.

invalid_status422Durum tanınmıyor.

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/cfeedbacks/4' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"status":"approved"}'
```

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

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/website/cfeedbacks/' . $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' => 'approved']),
]);

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

```php
// Onay bir ANAHTAR degil DURUM degisimidir; siteye cikaran tek sey budur.
Api::Website()->UpdateCfeedback(['id' => $id, 'status' => 'approved']);
```

### Yorumu Silme

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

`Website/DeleteCfeedback` admin

Yorumu kaldırır.

Dönen alanlar data — 2

deletedboolSilme çalıştı mı.

idintSilinen yorumun numarası.

Hatalar 3

cfeedback_not_found404Yorum bulunamadı.

delete_failed500Yorum silinemedi.

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/cfeedbacks/4' \
  -H "Authorization: Bearer $API_KEY"
```

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

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/website/cfeedbacks/' . $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
// Silmek yerine REDDEDIN: kayit durur, sitede gorunmez, kimin ne yazdigi kaybolmaz.
Api::Website()->UpdateCfeedback(['id' => $id, 'status' => 'rejected']);
```

### Avatar Yükleme

put/api/v1/admin/website/cfeedbacks/{id}/picture

`Website/SetCfeedbackPicture` admin

Yorumun yanında görünecek avatarı yükler.

Gövde 1

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

Dönen alanlar 201 — data — 1

urlstringAvatarın genel adresi.

Hatalar 2

cfeedback_not_found404Yorum bulunamadı.

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/cfeedbacks/4/picture' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"image":"https://ornek.com/avatar.jpg"}'
```

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

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/website/cfeedbacks/' . $id . '/picture');
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/avatar.jpg']),
]);

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

```php
// Avatar ZORUNLU DEGILDIR; yoksa tema kendi yer tutucusunu koyar.
Api::Website()->SetCfeedbackPicture(['id' => $id, 'image' => $data]);
```

### Avatarı Kaldırma

delete/api/v1/admin/website/cfeedbacks/{id}/picture

`Website/DeleteCfeedbackPicture` admin

Yorumun avatarını kaldırır.

Dönen alanlar data — 2

deletedboolSilme çalıştı mı.

idintYorumun numarası.

Hatalar 2

cfeedback_not_found404Yorum bulunamadı.

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/cfeedbacks/4/picture' \
  -H "Authorization: Bearer $API_KEY"
```

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

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

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/website/cfeedbacks/' . $id . '/picture');
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
// Avatari DEGISTIRMEK icin once silmeye gerek yok; yukleme zaten yerine koyar.
Api::Website()->DeleteCfeedbackPicture(['id' => $id]);
```

## Tuzaklar

> **Yeni yorum beklemede doğar**
> 
> Durum alanını göndermezseniz yorum **beklemede** oluşur ve sitede görünmez. Panelden elle girilen bir referans için bu genellikle istenen davranış değildir; oluştururken durumu onaylı gönderin ya da hemen ardından güncelleyin. Ziyaretçiden gelen kayıtlarda ise beklemede doğması doğru olandır.

> **Duruma göre süzemezsiniz**
> 
> Listeleme ucu yalnız arama, sayfa ve sayfa boyutu alır; **durum süzgeci yoktur**. Onay bekleyenleri bulmak için listeyi çekip kendiniz ayıklamanız gerekir. Yorum sayısı çok olan bir kurulumda sayfa sayfa gezip her sayfada ayıklama yapmayı hesaba katın.

> **Yorumun metni listede yoktur**
> 
> Liste adı, firmayı, e-postayı ve durumu verir ama **yorumun kendisini vermez**. Neyin onaylandığına karar vermek için her kaydı detay ucundan okumanız gerekir. Onay akışı yazarken bunu hesaba katın: liste tek başına karar vermeye yetmez.

> **E-posta ve adres kayıtta durur**
> 
> Yorum kaydı gönderenin e-postasını ve **geldiği adresi** taşır; ikisi de sitede gösterilmez ama detay ucundan okunabilir. Bu kişisel veridir. Yorumları dışarıya taşıyan bir entegrasyon yazarken bu iki alanı istemeden aktarmamaya dikkat edin.

> **Silmek yerine reddedin**
> 
> Reddedilen bir yorum sitede görünmez ama **kayıt yerinde kalır**: kimin ne zaman ne yazdığı ve hangi karara varıldığı okunabilir durumda durur. Silmek bunların hepsini götürür ve aynı kişi yeniden yazarsa geçmişi göremezsiniz.

## İlgili Makaleler

- [Site Sayfaları](https://dev.wisecp.com/tr/site-sayfalari)
- [Ana Sayfa Slaytları](https://dev.wisecp.com/tr/ana-sayfa-slaytlari)
- [Gelen Mesaj Kutusu](https://dev.wisecp.com/tr/gelen-mesaj-kutusu)
