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()