You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP应用中能否通过Shopify API无循环批量更新所有商品inventory_policy?

通过Shopify API批量更新商品inventory_policy(无需PHP端循环商品)

Shopify API没有提供直接一次性修改所有商品inventory_policy的REST端点,但可以通过**批量操作API(Bulk Operations API)**实现无需在PHP端逐个遍历商品发送请求——这个API会让Shopify后台异步处理批量更新任务,你只需要提交任务并等待结果即可。

实现步骤(PHP)

  1. 构造批量更新的GraphQL Mutation
    批量操作需要用GraphQL定义要执行的更新逻辑,指定筛选所有商品(或按条件筛选)并修改inventory_policy字段。

  2. 提交批量任务请求
    向Shopify的GraphQL端点发送请求,触发批量更新任务。

  3. 轮询任务状态
    提交任务后需要定期查询任务状态,直到任务完成、失败或取消。(注意:这里的轮询是针对任务状态,而非逐个商品,和传统循环更新完全不同)

代码示例

假设你已经配置好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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 10:45:45