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.

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

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.

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
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
{
  "first": 250,
  "after": "eyJsYXN0X2lkIjoxMjM0NTY3ODkwLCJsYXN0X3ZhbHVlIjoiMTIzNDU2Nzg5MCJ9",
  "query": "status:active updated_at:>=2026-10-01"
}
products-page.response.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
// 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);
}

Lintel tarafından yazıldı. MIT lisansı: kendi mağazanızda da müşteri işlerinizde de ücretsiz kullanabilirsiniz.

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.

Sık sorulan 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.
  • Gösterilen tarihte, 2026-10 sürümünün Admin veya Storefront API şemasıyla doğrulandı. İstek adresinizdeki sürümü kontrol edin.
  • Örneklerdeki ID’ler ve mağaza adresleri yer tutucudur. Kendi değerlerinizle değiştirin.
  • Admin API çağrıları uygulamanızdan bir erişim anahtarı (access token) ister. Admin API anahtarını asla vitrine ya da temaya koymayın.
  • MIT lisansı. Kodu kendi mağazanızda da müşteri işlerinizde de kullanabilirsiniz.

Mağazanız için kurulmasını, test edilmesini ve bakımını isterseniz: API entegrasyonları.

Geliştirmek istediğiniz bir şey mi var? Gelin, birlikte konuşalım.

Aynı anda sınırlı sayıda proje alıyoruz.

Gencer KarakayaShopify mühendisi

Proje özetinizi bir mühendis okur; size e-postayla yanıt veririz.