В меню нет пунктов созданных через API
-
Код на Python
import requests
import logging Настройка логгераlogging.basicConfig(filename=’menu_creation.log’, level=logging.INFO,
format=’%(asctime)s %(levelname)s — %(message)s’) Параметры для WooCommerce и WordPresswoo_url = ‘адресс сайта
woo_consumer_key = ‘ключ’
woo_consumer_secret = ‘секрет’
wordpress_url = ‘адресс сайта’
wordpress_user = ‘имя’
wordpress_password = ‘пароль’ Функция для получения JWT токенаdef get_jwt_token():
try:
auth_response = requests.post(f'{wordpress_url}/wp-json/jwt-auth/v1/token’, json={
‘username’: wordpress_user,
‘password’: wordpress_password
})
auth_response.raise_for_status()
token = auth_response.json()[‘token’]
logging.info(«JWT токен получен успешно.»)
return token
except requests.exceptions.HTTPError as e:
logging.error(f»Произошла ошибка HTTP при получении JWT токена: {e}»)
except Exception as e:
logging.error(f»Произошла ошибка при получении JWT токена: {e}»)
return None Функция для получения всех категорий из WooCommercedef get_all_categories():
try:
categories = []
page = 1
per_page = 100 # Максимальное количество категорий на странице
while True:
url = f'{woo_url}/wp-json/wc/v3/products/categories’
params = {
‘consumer_key’: woo_consumer_key,
‘consumer_secret’: woo_consumer_secret,
‘page’: page,
‘per_page’: per_page
}
response = requests.get(url, params=params)
response.raise_for_status()
page_categories = response.json()
categories.extend(page_categories)
if len(page_categories) < per_page:
break
page += 1
logging.info(«Категории из WooCommerce успешно получены.»)
return categories
except requests.exceptions.HTTPError as e:
logging.error(f»Произошла ошибка HTTP при получении категорий из WooCommerce: {e}»)
except Exception as e:
logging.error(f»Произошла ошибка при получении категорий из WooCommerce: {e}»)
return None Функция для создания нового менюdef create_menu(jwt_token):
try:
headers = {
‘Authorization’: f’Bearer {jwt_token}’,
‘Content-Type’: ‘application/json’
}
new_menu_data = {
‘name’: ‘Основное меню’, # Укажите название вашего меню здесь
‘location’: ‘primary’ # Укажите местоположение вашего меню здесь
}response = requests.post(f'{wordpress_url}/wp-json/wp/v2/menus', headers=headers, json=new_menu_data) response.raise_for_status() menu_data = response.json() menu_id = menu_data['id'] logging.info(f"Создано новое меню с ID: {menu_id}") return menu_id # Возвращаем только ID меню except requests.exceptions.HTTPError as e: logging.error(f"Произошла ошибка HTTP при создании меню: {e}") except Exception as e: logging.error(f"Произошла ошибка при создании меню: {e}") return None
Функция для добавления элементов меню в созданное меню (рекурсивная)
def add_menu_items_recursive(categories, menu_id, jwt_token, parent_id=0):
try:
headers = {
‘Authorization’: f’Bearer {jwt_token}’,
‘Content-Type’: ‘application/json’
}created_menu_items = {} # Словарь для отслеживания созданных элементов меню # Сначала добавляем все родительские элементы меню for category in categories: if 'parent' not in category or category['parent'] == 0: try: category_id = category['id'] logging.info(f"Добавляем родительскую категорию: {category['name']} с ID: {category_id}. Параметры: {{'menu_id': {menu_id}, 'parent_id': {parent_id}}}") # Проверяем, есть ли уже элемент меню с этой категорией if category_id not in created_menu_items: # Формируем URL категории category_url = f'{woo_url}/product-category/{category["slug"]}/' menu_item_data = { 'menu-item-object-id': str(category_id), 'menu-item-object': 'product_cat', 'menu-item-parent': parent_id if parent_id != 0 else 0, 'menu-item-title': category['name'], # Убедитесь, что указываете название 'menu-item-url': category_url, # Укажите URL категории в WooCommerce 'menu-item-type': 'custom', # Указываем тип пользовательского элемента меню 'title': category['name'], # Обязательное поле для пользовательского элемента 'url': category_url # Обязательное поле для пользовательского элемента } response = requests.post(f'{wordpress_url}/wp-json/wp/v2/menu-items', headers=headers, json=menu_item_data) response.raise_for_status() menu_item_id = response.json()['id'] created_menu_items[category_id] = menu_item_id logging.info(f"Элемент меню добавлен: {category['name']} с ID: {menu_item_id}, пермалинк: {category_url}") # Рекурсивно добавляем дочерние категории, если они есть if 'children' in category and category['children']: add_menu_items_recursive(category['children'], menu_id, jwt_token, menu_item_id) except requests.exceptions.HTTPError as e: logging.error(f"Произошла ошибка HTTP при добавлении элемента меню для категории '{category['name']}': {e}") if response.status_code == 400: logging.error(f"Детали ошибки: {response.json()}") except Exception as e: logging.error(f"Произошла ошибка при добавлении элемента меню для категории '{category['name']}': {e}") # Затем добавляем дочерние элементы, если они еще не были добавлены for category in categories: if 'parent' in category and category['parent'] != 0: try: category_id = category['id'] parent_category_id = category['parent'] logging.info(f"Добавляем дочернюю категорию: {category['name']} с ID: {category_id} к родительской категории с ID: {parent_category_id}. Параметры: {{'menu_id': {menu_id}, 'parent_id': {parent_category_id}}}") # Проверяем, есть ли уже элемент меню с этой категорией if category_id not in created_menu_items: # Проверяем, есть ли уже созданный родительский элемент меню if parent_category_id in created_menu_items: # Формируем URL категории category_url = f'{woo_url}/product-category/{category["slug"]}/' menu_item_data = { 'menu-item-object-id': str(category_id), 'menu-item-object': 'product_cat', 'menu-item-parent': created_menu_items[parent_category_id], 'menu-item-title': category['name'], # Убедитесь, что указываете название 'menu-item-url': category_url, # Укажите URL категории в WooCommerce 'menu-item-type': 'custom', # Указываем тип пользовательского элемента меню 'title': category['name'], # Обязательное поле для пользовательского элемента 'url': category_url # Обязательное поле для пользовательского элемента } response = requests.post(f'{wordpress_url}/wp-json/wp/v2/menu-items', headers=headers, json=menu_item_data) response.raise_for_status() menu_item_id = response.json()['id'] created_menu_items[category_id] = menu_item_id logging.info(f"Элемент меню добавлен: {category['name']} с ID: {menu_item_id}, пермалинк: {category_url}") # Рекурсивно добавляем дочерние категории, если они есть if 'children' in category and category['children']: add_menu_items_recursive(category['children'], menu_id, jwt_token, menu_item_id) except requests.exceptions.HTTPError as e: logging.error(f"Произошла ошибка HTTP при добавлении элемента меню для категории '{category['name']}': {e}") if response.status_code == 400: logging.error(f"Детали ошибки: {response.json()}") except Exception as e: logging.error(f"Произошла ошибка при добавлении элемента меню для категории '{category['name']}': {e}") except Exception as e: logging.error(f"Произошла ошибка при рекурсивном добавлении элементов меню: {e}")
Функция для привязки элементов меню к созданному меню
def assign_menu_items_to_menu(menu_id, jwt_token):
try:
headers = {
‘Authorization’: f’Bearer {jwt_token}’,
‘Content-Type’: ‘application/json’
}# Проверка, привязаны ли элементы меню к меню menu_items = requests.get(f'{wordpress_url}/wp-json/wp/v2/menu-items', headers=headers).json() if not menu_items: logging.warning(f"В меню с ID: {menu_id} нет элементов.") else: logging.info(f"В меню с ID: {menu_id} уже есть элементы.") response = requests.post(f'{wordpress_url}/wp-json/wp/v2/menus/{menu_id}', headers=headers) response.raise_for_status() logging.info(f"Элементы меню успешно привязаны к меню с ID: {menu_id}") except requests.exceptions.HTTPError as e: logging.error(f"Произошла ошибка HTTP при привязке элементов меню к меню с ID: {menu_id}: {e}") except Exception as e: logging.error(f"Произошла ошибка при привязке элементов меню к меню с ID: {menu_id}: {e}")
Основная функция для выполнения всего процесса создания меню
def main():
try:
# Получаем JWT токен
jwt_token = get_jwt_token()
if not jwt_token:
logging.error(«Не удалось получить JWT токен. Процесс завершается.»)
return# Получаем все категории из WooCommerce categories = get_all_categories() if not categories: logging.error("Не удалось получить категории из WooCommerce. Процесс завершается.") return # Создаем новое меню в WordPress menu_id = create_menu(jwt_token) if not menu_id: logging.error("Не удалось создать меню в WordPress. Процесс завершается.") return # Добавляем элементы меню в созданное меню add_menu_items_recursive(categories, menu_id, jwt_token) # Привязываем элементы меню к созданному меню assign_menu_items_to_menu(menu_id, jwt_token) logging.info("Процесс создания меню завершен успешно.") except Exception as e: logging.error(f"Произошла общая ошибка в процессе создания меню: {e}")
Вызываем основную функцию для запуска процесса создания меню
if name == «main«:
main()Согласно логам:
2024-07-30 12:13:10,022 INFO - JWT токен получен успешно.
2024-07-30 12:13:13,934 INFO - Категории из WooCommerce успешно получены.
2024-07-30 12:13:14,168 INFO - Создано новое меню с ID: 7913
2024-07-30 12:13:14,168 INFO - Добавляем родительскую категорию: Accessories с ID: 7840. Параметры: {'menu_id': 7913, 'parent_id': 0}
2024-07-30 12:13:14,449 INFO - Элемент меню добавлен: Accessories с ID: 82121, пермалинк: https://название сайта/product-category/accessories/
2024-07-30 12:13:14,449 INFO - Добавляем родительскую категорию: Apple с ID: 6200. Параметры: {'menu_id': 7913, 'parent_id': 0}
2024-07-30 12:13:14,772 INFO - Элемент меню добавлен: Apple с ID: 82122, пермалинк: https://название сайта/product-category/apple/
2024-07-30 12:13:14,772 INFO - Добавляем родительскую категорию: Google с ID: 6214. Параметры: {'menu_id': 7913, 'parent_id': 0}
2024-07-30 12:13:15,010 INFO - Элемент меню добавлен: Google с ID: 82123, пермалинк: https://название сайта/product-category/google/
2024-07-30 12:13:15,010 INFO - Добавляем родительскую категорию: Huawei / Honor с ID: 6203. Параметры: {'menu_id': 7913, 'parent_id': 0}
2024-07-30 12:13:15,276 INFO - Элемент меню добавлен: Huawei / Honor с ID: 82124, пермалинк: https://название сайта/product-category/huaweihonor/
2024-07-30 12:13:15,276 INFO - Добавляем родительскую категорию: Infinix с ID: 6226. Параметры: {'menu_id': 7913, 'parent_id': 0}
2024-07-30 12:13:15,526 INFO - Элемент меню добавлен: Infinix с ID: 82125, пермалинк: https://название сайта/product-category/infinix/
2024-07-30 12:13:15,526 INFO - Добавляем родительскую категорию: Men с ID: 7851. Параметры: {'menu_id': 7913, 'parent_id': 0}
2024-07-30 12:13:15,772 INFO - Элемент меню добавлен: Men с ID: 82126, пермалинк: https://название сайта/product-category/men/
2024-07-30 12:13:15,772 INFO - Добавляем родительскую категорию: Men's Jeans с ID: 7852. Параметры: {'menu_id': 7913, 'parent_id': 0}
2024-07-30 12:13:16,010 INFO - Элемент меню добавлен: Men's Jeans с ID: 82127, пермалинк: https://название сайта/product-category/mens-jeans/
2024-07-30 12:13:16,010 INFO - Добавляем родительскую категорию: Men's Shirts с ID: 7853. Параметры: {'menu_id': 7913, 'parent_id': 0}
2024-07-30 12:13:16,276 INFO - Элемент меню добавлен: Men's Shirts с ID: 82128, пермалинк: https://название сайта/product-category/mens-shirts/
2024-07-30 12:13:16,276 INFO - Добавляем родительскую категорию: Men's Shoes с ID: 7854. Параметры: {'menu_id': 7913, 'parent_id': 0}
2024-07-30 12:13:16,510 INFO - Элемент меню добавлен: Men's Shoes с ID: 82129, пермалинк: https://название сайта/product-category/mens-shoes/
2024-07-30 12:13:16,510 INFO - Добавляем родительскую категорию: Misc с ID: 16. Параметры: {'menu_id': 7913, 'parent_id': 0}
2024-07-30 12:13:16,756 INFO - Элемент меню добавлен: Misc с ID: 82130, пермалинк: https://название сайта/product-category/misc/
2024-07-30 12:13:16,756 INFO - Добавляем родительскую категорию: Motorola с ID: 6202. Параметры: {'menu_id': 7913, 'parent_id': 0}
2024-07-30 12:13:17,011 INFO - Элемент меню добавлен: Motorola с ID: 82131, пермалинк: https://название сайта/product-category/motorola/
......
2024-07-30 12:23:04,953 INFO - Элементы меню успешно привязаны к меню с ID: 7913
2024-07-30 12:23:04,953 INFO - Процесс создания меню завершен успешно.
Захожу в меню, а в нем пусто....
- Тема «В меню нет пунктов созданных через API» закрыта для новых ответов.