Created
September 19, 2022 10:44
-
-
Save DxDiagDx/a7c9026cc65b75c62c57cf4714d9269a to your computer and use it in GitHub Desktop.
Woo API — экспорт дерева категорий. WooCommerce Get Categories Tree
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
import csv | |
from woocommerce import API | |
from config import consumer_key, consumer_secret, site | |
wcapi = API( | |
url=site, | |
consumer_key=consumer_key, | |
consumer_secret=consumer_secret, | |
wp_api=True, | |
version="wc/v3" | |
) | |
def create_csv(filename, fieldnames): | |
with open(filename, 'w', encoding='utf-8', newline='') as file: | |
csv.DictWriter(file, fieldnames=fieldnames).writeheader() | |
def write_csv(filename, data): | |
with open(filename, 'a', encoding='utf-8', newline='') as file: | |
csv.DictWriter(file, fieldnames=list(data)).writerow(data) | |
def get_categories(per_page=20, offset=0): | |
params = ( | |
("per_page", per_page), | |
("offset", offset), | |
("order", "asc"), | |
("orderby", "id") | |
) | |
response = wcapi.get("products/categories", params=params) | |
categories = response.json() | |
return categories | |
def get_all_categories(): | |
filename = "all_categories.csv" | |
fieldnames = ['id', 'name', 'parent'] | |
create_csv(filename, fieldnames) | |
per_page = 20 | |
offset = 0 | |
while True: | |
print('Скачиваем категории c', offset, 'по', offset + per_page) | |
categories = get_categories( | |
per_page=per_page, | |
offset=offset | |
) | |
if not categories: | |
break | |
for category in categories: | |
write_csv( | |
filename=filename, | |
data={ | |
"id": category["id"], | |
"name": category["name"], | |
"parent": category['parent'] | |
} | |
) | |
offset += per_page | |
def get_category_path(category_value, categories, category_path): | |
category_path.append(category_value['name']) | |
if category_value['parent'] != '0': | |
get_category_path(categories[category_value['parent']], categories, category_path) | |
return category_path | |
def create_categories_tree(): | |
filename = 'categories_tree.csv' | |
fieldnames = ['id', 'category'] | |
create_csv(filename, fieldnames) | |
categories = {} | |
with open('all_categories.csv', 'r', encoding='utf-8') as file: | |
for line in csv.DictReader(file): | |
categories[line["id"]] = line | |
for index, category in enumerate(categories.items()): | |
if 0 <= index: | |
category_id, category_value = category | |
category_path = get_category_path(category_value, categories, category_path=[]) | |
category_path.reverse() | |
data = { | |
'id': category_id, | |
'category': '>'.join(category_path) | |
} | |
write_csv(filename=filename, data=data) | |
def main(): | |
get_all_categories() | |
create_categories_tree() | |
if __name__ == '__main__': | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment