LoginSignup
0
0

More than 1 year has passed since last update.

Shopifyのページネーションで全プロダクトとタグをGET

Last updated at Posted at 2022-06-18

Shopifyページネーションの関数

ShopifyApiライブラリ試したが、ドキュメント少ないし、Webhook登録で挙動がおかしい&Github Issueで指摘されているにも関わらず回答放置(?)のようで、頼らないことにした。
Shopifyのページネーション情報は

  • ヘッダーに格納されている
  • <リクエストURL>; rel="next/previous"という風な文字列になっていて、分解しないといけない
  • "次"がない時は同様のヘッダーが存在するがrel="previous"になる/最初から"次"がない=1リクエストで完結する時はそのヘッダーがない

という仕様で若干ややこしいので関数化することにした。後でClass化しようかな。

# <SHOP>, <API_VERSION>, <ACCESS_TOKEN>は自分でセットしてね

shop_url = f"{SHOP}.myshopify.com"
api_version = "<API_VERSION>"
baseURL = rf"https://{shop_url}/admin/api/{api_version}/"
headers_ = {'Content-Type': 'application/json',
            'X-Shopify-Access-Token': ACCESS_TOKEN}

def get_productsANDtags():
    import re, requests

    products = []
    next = ""
    rel = "next"
    page_info = ""
    # CAUTION : Archived以外でかつフィールドが絞られています。
    product_params_ = {"status": "active,draft", "limit" : 250, "fields":"id,title,tags,variants"}
    s = re.compile('page_info=(.*?)>.*rel="(.*?)"')

    while next != None and rel != "previous":
        if next != "":
            product_params_["page_info"] = page_info
            product_params_.pop("status", None)
        products_r = requests.get(baseURL + "products.json" , headers= headers_, params=product_params_)
        products.extend(products_r.json()["products"])
        next = products_r.headers.get("link")
        if next != None:
            regexSearch =re.search(s,next).groups()
            page_info = regexSearch[0]
            rel = regexSearch[1]
    tags = [product["tags"].split(",") for product in products]
    tags_flat = set([tag for tag_set in tags for tag in tag_set])

ちなみに①

"全タグ"、ということならサーチテンプレをLiquidで作ってそれをgetする、という方法がこちらに紹介されている↓
https://stackoverflow.com/questions/60920840/get-all-tags-used-by-a-shopify-shop-in-one-request

ちなみに②

ShopifyApiライブラリで全プロダクトと全タグGETなら

ShopifySession = shopify.Session(shop_url, api_version, ACCESS_TOKEN)
shopify.ShopifyResource.activate_session(ShopifySession)

all_Shopify_products = []

products = shopify.Product().find(limit=250, status = "active,draft",fields="id,title,tags,variants")
# パラメーターをそのまま使える感じ
all_Shopify_products.extend(products)
has_more = products.has_next_page()

while has_more:
     products = products.next_page()
     all_Shopify_products.extend(products)
     has_more = products.has_next_page()

tags = [product.tags.split(",") for product in products]
tags_flat = set([tag.strip().replace("\t","") for tag_set in tags for tag in tag_set])
# タグの中にtabを見かけたことがある

shopify.ShopifyResource.clear_session()

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0