Skip to content

Instantly share code, notes, and snippets.

@DxDiagDx
Created September 19, 2022 10:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save DxDiagDx/a7c9026cc65b75c62c57cf4714d9269a to your computer and use it in GitHub Desktop.
Save DxDiagDx/a7c9026cc65b75c62c57cf4714d9269a to your computer and use it in GitHub Desktop.
Woo API — экспорт дерева категорий. WooCommerce Get Categories Tree
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