Как эффективно получить список всех коллекций, к которым относится продукт, в Shopify?

#shopify #shopify-api

Вопрос:

Я хочу создать экспорт данных о продуктах в формате CSV из магазина Shopify. Для каждого продукта я экспортирую данные, такие как название продукта, цена, URL-адрес изображения и т. Д… В этом экспорте я также хочу перечислить для каждого продукта все коллекции, к которым относится продукт, предпочтительно в иерархическом порядке, коллекции отображаются в меню навигации сайта (например, Мужчины > Рубашки >> Красные рубашки).

Если мое понимание API правильно, для каждого продукта мне нужно сделать отдельный вызов API сбора, чтобы получить список коллекций, к которым он принадлежит, а затем еще один вызов API коллекций, чтобы получить дескриптор каждой коллекции. Это звучит как множество вызовов API для каждого продукта.

  • Есть ли более эффективный способ сделать это?
  • Есть ли какой-либо способ выяснить вышеупомянутую иерархию коллекций?

Ответ №1:

К сожалению, как вы отметили, я не думаю, что существует эффективный способ сделать это из-за того, как структурирован API Shopify. Это не позволяет запрашивать коллекции из продуктов, а только продукты, запрашиваемые из коллекций. То есть нельзя увидеть, к каким коллекциям относится продукт, но можно увидеть, какие продукты принадлежат коллекции.

Отношения по Сбору Продуктов

Ресурс ShopifyAPI::Collect or ShopifyAPI::Collection REST не возвращает информацию о вариантах продукта, необходимую для получения информации о ценах в соответствии с требованиями. Кроме того, ShopifyAPI::Collect ограничивается только пользовательскими коллекциями и не будет работать для продуктов в ShopifyAPI::SmartCollection s. По этой причине я предлагаю использовать GraphQL вместо REST для получения необходимой информации.

 query ($collectionCursor: String, $productCursor: String){
  collections(first: 1, after: $collectionCursor) {
    edges {
      cursor
      node {
        id
        handle
        products(first: 8, after: $productCursor){
          edges{
            cursor
            node{
              id
              title
              variants(first: 100){
                edges{
                  node{
                    price
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}
 
 {
  "collectionCursor": null,
  "productCursor": null
}
 

$productCursor Переменную можно использовать для перебора всех продуктов в коллекции и $collectionCursor для перебора всех коллекций. Обратите внимание, что необходимо запросить только первые 100 вариантов, поскольку Shopify имеет жесткое ограничение на 100 вариантов для каждого продукта.

Один и тот же запрос можно использовать для перебора ShopifyAPI::SmartCollection «s».

В качестве альтернативы тот же запрос с использованием REST API будет выглядеть примерно так в Ruby.

 collections = ShopifyAPI::Collection.all # paginate
collection.each do |collection|
    collection.products.each do |product|
      product.title
      # note the extra call the Product API to get varint info
      ShopifyAPI::Product.find(product.id).variants.each do |varaint|
        variant.price
      end
    end
end
 

Я не вижу никакого способа устранить недостатки с помощью запроса REST, но вы можете улучшить запросы GraphQL, используя массовые операции GraphQL от Shopify.