Last active
February 8, 2023 13:24
-
-
Save tombola/4aaaafc834304f9be491c2d4517dc367 to your computer and use it in GitHub Desktop.
Decorator to make multiple requests to WooCommerce REST API to get paged results
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from woocommerce import API | |
WC_MAX_API_RESULT_COUNT = 100 | |
wcapi = API( | |
url=url, | |
consumer_key=key, | |
consumer_secret=secret, | |
version="wc/v3", | |
timeout=300, | |
) | |
def wcapi_aggregate_paginated_response(func): | |
""" | |
Repeat calls a decorated function to get all pages of WooCommerce API response. | |
Combines the response data into a single list. | |
Decorated function must accept parameters: | |
- wcapi object | |
- page number | |
""" | |
def wrapper(wcapi, page=0, *args, **kwargs): | |
items = [] | |
page = 0 | |
num_pages = WC_MAX_API_RESULT_COUNT | |
while page < num_pages: | |
page += 1 | |
log.debug(f"{page=}") | |
response = func(wcapi, page=page, *args, **kwargs) | |
items.extend(response.json()) | |
num_pages = int(response.headers["X-WP-TotalPages"]) | |
num_products = int(response.headers["X-WP-Total"]) | |
log.debug(f"{num_products=}, {len(items)=}") | |
return items | |
return wrapper | |
@wcapi_aggregate_paginated_response | |
def get_all_wc_orders(wcapi, page=1): | |
""" | |
Query WooCommerce rest api for all products | |
""" | |
response = wcapi.get( | |
"orders", | |
params={ | |
"per_page": WC_MAX_API_RESULT_COUNT, | |
"page": page, | |
}, | |
) | |
response.raise_for_status() | |
return response | |
orders = get_all_wc_orders(wcapi) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment