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
- ProductsPage’i first: 250 ve after: null ile gönderin.
- data.products.nodes’u işleyin, ardından pageInfo.endCursor’ı okuyun.
- Aynı sorguyu after’ı bu cursor yaparak tekrar gönderin; first, query ve sortKey’i değiştirmeyin.
- hasNextPage false olunca durun. paginate.js döngüyü hata yönetimiyle birlikte gösterir.
Kod
products-page.graphqlquery 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.
Shopify belgeleri
- 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ı.
