# Sonuçları cursor ile sayfalama

> Tüm ürün, sipariş ya da müşterileri sayfa sayfa okuyun: pageInfo isteyin, endCursor’ı after olarak verin, hasNextPage false olunca durun.

Sayfa: https://lintelagency.com/tr/kaynaklar/graphql/cursor-ile-sayfalama

## Kısaca

Shopify GraphQL bağlantıları cursor tabanlı sayfalama kullanır. first ile en fazla 250 kayıt isteyin ve pageInfo { hasNextPage endCursor } seçin. Sonraki sayfa için aynı sorguyu after değerini bir önceki endCursor yaparak gönderin; hasNextPage false olunca durun. Sayfalar arasında query ve sortKey’i değiştirmeyin. 25.000’den fazla kayıt için bunun yerine bulk operation kullanın.

## Bilgiler

- **API:** Admin GraphQL API (Storefront API de aynı şekilde çalışır)
- **Argümanlar:** İleri için first/after, geri için last/before
- **Sayfa boyutu:** En fazla 250 kayıt
- **Yerini aldığı REST çağrısı:** REST Link başlığındaki page_info linkleri
- **API sürümü:** 2026-10
- **Son kontrol:** 2 Kasım 2026

## Nasıl kullanılır

1. ProductsPage’i first: 250 ve after: null ile gönderin.
2. data.products.nodes’u işleyin, ardından pageInfo.endCursor’ı okuyun.
3. Aynı sorguyu after’ı bu cursor yaparak tekrar gönderin; first, query ve sortKey’i değiştirmeyin.
4. hasNextPage false olunca durun. paginate.js döngüyü hata yönetimiyle birlikte gösterir.

## Kod

### products-page.graphql

```graphql
query ProductsPage($first: Int!, $after: String, $query: String) {
  products(first: $first, after: $after, query: $query, sortKey: ID) {
    nodes {
      id
      handle
      updatedAt
    }
    pageInfo {
      hasNextPage
      endCursor
    }
  }
}
```

### products-page.variables.json

```json
{
  "first": 250,
  "after": "eyJsYXN0X2lkIjoxMjM0NTY3ODkwLCJsYXN0X3ZhbHVlIjoiMTIzNDU2Nzg5MCJ9",
  "query": "status:active updated_at:>=2026-10-01"
}
```

### products-page.response.json

```json
{
  "data": {
    "products": {
      "nodes": [
        {"id": "gid://shopify/Product/1234567891", "handle": "linen-shirt", "updatedAt": "2026-10-28T09:12:44Z"},
        {"id": "gid://shopify/Product/1234567892", "handle": "wool-scarf", "updatedAt": "2026-10-30T15:03:10Z"}
      ],
      "pageInfo": {
        "hasNextPage": false,
        "endCursor": "eyJsYXN0X2lkIjoxMjM0NTY3ODkyLCJsYXN0X3ZhbHVlIjoiMTIzNDU2Nzg5MiJ9"
      }
    }
  }
}
```

### paginate.js

```js
// Reads every page of a connection by passing pageInfo.endCursor back as
// `after` until hasNextPage is false. Node 18+ (global fetch).
const API_VERSION = '2026-10';
const PAGE_SIZE = 250;

export async function* allProducts({shop, token, document, query}) {
  let after = null;
  do {
    const response = await fetch(`https://${shop}/admin/api/${API_VERSION}/graphql.json`, {
      method: 'POST',
      headers: {'Content-Type': 'application/json', 'X-Shopify-Access-Token': token},
      body: JSON.stringify({query: document, variables: {first: PAGE_SIZE, after, query}}),
    });
    if (!response.ok) throw new Error(`Shopify returned HTTP ${response.status}`);
    const body = await response.json();
    if (body.errors) throw new Error(`GraphQL errors: ${JSON.stringify(body.errors)}`);
    const {nodes, pageInfo} = body.data.products;
    yield* nodes;
    after = pageInfo.hasNextPage ? pageInfo.endCursor : null;
  } while (after);
}
```

## Sınırlar ve özel durumlar

- Sayfalama bağlantı başına 25.000 kayıtla sınırlıdır ve sayımlar 25.001’de durur. Daha fazlası için query filtresini daraltın ya da bulk operation kullanın.
- Cursor’lar opak metinlerdir: olduğu gibi saklayın, kendiniz üretmeye çalışmayın.
- Büyük sayfalar istek başına daha pahalıdır; iç içe bağlantıları da sayfalıyorsanız sorgu maliyetini kontrol edin.
- Geri gitmek için pageInfo.startCursor ve hasPreviousPage ile last ve before kullanın.

## Sorular

### Shopify GraphQL API’de sayfalama nasıl çalışır?

Cursor’larla. Her sayfa pageInfo.endCursor döndürür; hasNextPage false olana kadar bunu after olarak verip sonraki sayfayı alırsınız.

### En büyük sayfa boyutu nedir?

first ya da last ile sayfa başına 250 kayıt.

### 25.000’den fazla ürün varsa hepsini nasıl alırım?

Her şeyi tek bir JSONL dosyası olarak döndüren bulkOperationRunQuery’yi kullanın ya da okumayı created_at aralıkları gibi query filtreleriyle bölün.

## Shopify belgeleri

- [Paginating results with GraphQL](https://shopify.dev/docs/api/usage/pagination-graphql)

## İlgili içerikler

- [Sorgu maliyetini ve throttle durumunu okuma](https://lintelagency.com/tr/kaynaklar/graphql/sorgu-maliyeti-ve-throttle-durumu)
- [Tüm ürünleri bulk operation ile dışa aktarma](https://lintelagency.com/tr/kaynaklar/graphql/tum-urunleri-toplu-disa-aktarma)
- [Lokasyona göre stok seviyelerini okuma](https://lintelagency.com/tr/kaynaklar/graphql/lokasyona-gore-stok-seviyeleri)

Lisans: MIT. Kendi mağazanızda da müşteri işlerinizde de ücretsiz kullanabilirsiniz.
