PHPFixing
  • Privacy Policy
  • TOS
  • Ask Question
  • Contact Us
  • Home
  • PHP
  • Programming
  • SQL Injection
  • Web3.0

Friday, July 1, 2022

[FIXED] How to efficiently retrieve a list of all collections a product belongs to in Shopify?

 July 01, 2022     shopify, shopify-api     No comments   

Issue

I want to create a CSV export of product data from a Shopify store. For each product I'm exporting data like the product name, price, image URL etc... In this export I also want to list, for each product, all the collections the product belongs to, preferably in the hierarchal order the collections appear in the site's navigation menu (e.g Men > Shirts > Red Shirts).

If my understanding of the API is correct, for each product I need to make a separate call to the Collect API to get a list of collections it belongs to then another call to the Collections API to get the handle of each collection. This sounds like a lot of API calls for each product.

  • Is there a more efficient way to do this?
  • Is there any way to figure out the aforementioned hierarchy of collections?

Solution

Unfortunately, as you pointed out, I don't think there is an efficient way of doing this because of the way that the Shopify API is structured. It does not permit collections to be queried from products, rather only products queried from collections. That is, one can't see what collections a product belongs to, but can see what products belong to a collection.

Product Collection Relationship

The ShopifyAPI::Collect or ShopifyAPI::Collection REST resource does not return Product variant information, which is needed to get the price information as per the requirements. Furthermore, ShopifyAPI::Collect is limited to custom collections only, and would not work for products in ShopifyAPI::SmartCollection's. For this reason I suggest using GraphQL instead of REST to get the information needed.

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
}

The $productCursor variable can be used to iterate over all of the products in a collection and the $collectionCursor to iterate over all collections. Note that only the first 100 variants need to be queried since Shopify has a hard limit on 100 variants per product.

The same query can be used to iterate over ShopifyAPI::SmartCollection's.

Alternatively the same query using the REST API would look something like this in 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

I don't see any way to address the inefficiencies with the REST query, but you might be able to improve on the GraphQL queries by using Shopify's GraphQL Bulk Operations.



Answered By - kcamel
Answer Checked By - Marilyn (PHPFixing Volunteer)
  • Share This:  
  •  Facebook
  •  Twitter
  •  Stumble
  •  Digg
Newer Post Older Post Home

0 Comments:

Post a Comment

Note: Only a member of this blog may post a comment.

Total Pageviews

Featured Post

Why Learn PHP Programming

Why Learn PHP Programming A widely-used open source scripting language PHP is one of the most popular programming languages in the world. It...

Subscribe To

Posts
Atom
Posts
Comments
Atom
Comments

Copyright © PHPFixing