如何通过API获取仅在Shopify店铺菜单中显示的集合?
Got it, let's break down how to get only those collections that show up in your Shopify store's navigation menus using the API. Since menu collections are a subset of published collections, we need to connect the dots between navigation menus and the collections they link to.
Step 1: Retrieve All Store Navigation Menus
First, pull in all the navigation menus from your store using the Shopify Admin API's Navigation Menus endpoint. This includes main navigation, footer menus, and any custom menus you've set up.
The endpoint to use is:
GET /admin/api/2024-07/menus.json
(Swap 2024-07 for the latest stable API version your integration uses)
This will return a list of menus, each with an items array containing all top-level menu entries.
Step 2: Extract Collection References from Menu Items
Next, we need to sift through all menu items (including nested sub-items in dropdowns) to find entries that link to collections. A collection menu item will have:
type: "collection"resource_id: The unique ID of the linked collection- Alternatively, a
urlfield that includes/collections/{handle}(handy if you prefer working with collection handles instead of IDs)
Example: Filtering Menu Items (Python)
Here's a quick snippet to collect all collection IDs from every menu:
import requests # Replace these with your store's API credentials API_KEY = "your_api_key" PASSWORD = "your_api_password" SHOP_NAME = "your-shop-name.myshopify.com" API_VERSION = "2024-07" # Fetch all menus response = requests.get( f"https://{API_KEY}:{PASSWORD}@{SHOP_NAME}/admin/api/{API_VERSION}/menus.json" ) menus = response.json()["menus"] collection_ids = set() def extract_collection_ids(items): for item in items: # Check if the menu item links to a collection if item.get("type") == "collection": collection_ids.add(item["resource_id"]) # Recursively check sub-items (for dropdown menus) if "items" in item: extract_collection_ids(item["items"]) # Process all menus to collect collection IDs for menu in menus: extract_collection_ids(menu["items"]) # Convert IDs to a comma-separated string for bulk fetching collection_ids_str = ",".join(map(str, collection_ids))
Step 3: Fetch the Target Collections
Now use the collected IDs to pull only the collections that appear in your menus. Use the Collections endpoint with the ids parameter to get them in a single request (way more efficient than fetching one by one):
GET /admin/api/2024-07/collections.json?ids={collection_ids_str}
Example: Fetching Collections (Python)
response = requests.get( f"https://{API_KEY}:{PASSWORD}@{SHOP_NAME}/admin/api/{API_VERSION}/collections.json?ids={collection_ids_str}" ) menu_collections = response.json()["collections"] # Print out the results to verify for coll in menu_collections: print(f"Collection: {coll['title']} (Handle: {coll['handle']})")
Key Things to Keep in Mind
- Permissions: Ensure your API access token has the
read_navigationandread_collectionsscopes (or the broaderread_contentscope that covers both). - Pagination: If your store has tons of menus or menu items, check the
Linkheader in the menus endpoint response to handle pagination. - Published Collections: Menus should only link to published collections, but if you want to be extra cautious, add
&published_status=publishedto the collections request to filter out any unpublished ones. - Using Handles: If you prefer working with handles instead of IDs, extract them from the menu item's
url(split the string to grab the part after/collections/), then fetch each collection viaGET /admin/api/{version}/collections/{handle}.json.
内容的提问来源于stack exchange,提问作者Sowmya CR

