PHP应用中能否通过Shopify API无循环批量更新所有商品inventory_policy?
通过Shopify API批量更新商品inventory_policy(无需PHP端循环商品)
Shopify API没有提供直接一次性修改所有商品inventory_policy的REST端点,但可以通过**批量操作API(Bulk Operations API)**实现无需在PHP端逐个遍历商品发送请求——这个API会让Shopify后台异步处理批量更新任务,你只需要提交任务并等待结果即可。
实现步骤(PHP)
构造批量更新的GraphQL Mutation
批量操作需要用GraphQL定义要执行的更新逻辑,指定筛选所有商品(或按条件筛选)并修改inventory_policy字段。提交批量任务请求
向Shopify的GraphQL端点发送请求,触发批量更新任务。轮询任务状态
提交任务后需要定期查询任务状态,直到任务完成、失败或取消。(注意:这里的轮询是针对任务状态,而非逐个商品,和传统循环更新完全不同)
代码示例
假设你已经配置好Shopify API的认证(API密钥、商店域名、访问令牌):
<?php $shopDomain = 'your-shop.myshopify.com'; $accessToken = 'your-access-token'; // 1. 构造批量更新的GraphQL请求 $graphqlQuery = <<<GQL mutation { bulkOperationRunMutation( mutation: """ mutation UpdateInventoryPolicy(\$id: ID!, \$inventoryPolicy: ProductInventoryPolicy!) { productUpdate(input: {id: \$id, inventoryPolicy: \$inventoryPolicy}) { product { id inventoryPolicy } } } """, query: """ { products(first: 1000) { edges { node { id } } pageInfo { hasNextPage endCursor } } } """ ) { bulkOperation { id status } userErrors { field message } } } GQL; // 2. 发送请求触发批量任务 $ch = curl_init("https://{$shopDomain}/admin/api/2024-07/graphql.json"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, [ "Content-Type: application/json", "X-Shopify-Access-Token: {$accessToken}" ]); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(['query' => $graphqlQuery])); $response = curl_exec($ch); curl_close($ch); $result = json_decode($response, true); if (isset($result['data']['bulkOperationRunMutation']['bulkOperation'])) { $bulkOperationId = $result['data']['bulkOperationRunMutation']['bulkOperation']['id']; echo "批量任务已提交,任务ID:{$bulkOperationId}\n"; // 3. 轮询任务状态(示例简单实现,实际可根据需求调整轮询间隔) while (true) { $statusQuery = <<<GQL { node(id: "{$bulkOperationId}") { ... on BulkOperation { status errorCode completedAt objectCount fileSize url } } } GQL; $ch = curl_init("https://{$shopDomain}/admin/api/2024-07/graphql.json"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, [ "Content-Type: application/json", "X-Shopify-Access-Token: {$accessToken}" ]); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(['query' => $statusQuery])); $statusResponse = curl_exec($ch); curl_close($ch); $statusResult = json_decode($statusResponse, true); $status = $statusResult['data']['node']['status']; echo "当前任务状态:{$status}\n"; if (in_array($status, ['COMPLETED', 'FAILED', 'CANCELED'])) { break; } // 等待10秒后再次查询 sleep(10); } } else { echo "提交批量任务失败:" . implode(', ', array_column($result['data']['bulkOperationRunMutation']['userErrors'], 'message')); } ?>
注意事项
- 批量操作API的查询部分支持分页,如果商品超过1000个,需要在GraphQL查询中处理分页(通过
endCursor和hasNextPage),确保覆盖所有商品。 - 任务执行过程中,Shopify会异步处理,你可以通过任务完成后的
url字段下载结果文件,查看更新详情。 - 请根据你使用的Shopify API版本调整请求URL中的版本号(示例中为2024-07)。
内容的提问来源于stack exchange,提问作者Hafizur Rahman
相关产品推荐
相关产品推荐

