• Код на Python

    import requests
    import logging Настройка логгера

    logging.basicConfig(filename=’menu_creation.log’, level=logging.INFO,
    format=’%(asctime)s %(levelname)s — %(message)s’) Параметры для WooCommerce и WordPress

    woo_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 Функция для получения всех категорий из WooCommerce

    def 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 - Процесс создания меню завершен успешно.

    Захожу в меню, а в нем пусто....
Просмотр 13 ответов — с 1 по 13 (всего 13)
  • Это че? Просто информацией поделился? Спасибо.

    Нет), это может кто-то занет причину почему пунты меню не отображаются в самом меню. Логи указывают, что все успешно… но меню остается пустым.

    А зачем это все? для чего??
    Пока это выглядит попыткой изобрести высокоточный мелкоскоп для забивания кровельных гвоздей-соток.

    Меню wordpress должно быть создано из кактегорий товаров woocomerce сохраняя иерархию как они были созданы. Категорий 1500.

    права есть, чтобы пункты меню создавать?

    Захожу в меню,

    это куда?

    а в нем пусто....

    то есть само меню где-то таки создается?

    Меню wordpress должно быть создано из кактегорий… Категорий 1500.

    «….грабить корованы…»?

    У меня тоже в админке не откроется меню на 1500+ пунктов — количества переменных в php не хватит. Базу смотрите.

    Категорий 1500.

    Сурово. Случайно не знаешь, что значит слово «оптимизация»?

    Да, само меню создается, только не содержит элементов. Вот сам элемент который судя по логу был привязан в меню

    MariaDB [smart_db]> SELECT * FROM wp_postmeta WHERE post_id = 82121;
    +———+———+——————————+—————————————————+
    | meta_id | post_id | meta_key | meta_value |
    +———+———+——————————+—————————————————+
    | 669179 | 82121 | _menu_item_type | custom |
    | 669180 | 82121 | _menu_item_menu_item_parent | 0 |
    | 669181 | 82121 | _menu_item_object_id | 82121 |
    | 669182 | 82121 | _menu_item_object | custom |
    | 669183 | 82121 | _menu_item_target | |
    | 669184 | 82121 | _menu_item_classes | a:1:{i:0;s:0:»»;} |
    | 669185 | 82121 | _menu_item_xfn | |
    | 669186 | 82121 | _menu_item_url | https://название сайта/product-category/accessories/ |
    | 669187 | 82121 | _menu_item_orphaned | 1722330792 |
    +———+———+——————————+—————————————————+

    Каждая категория в последующем будет содержать товары. Товаров 16000. Категории созданы для удобства распределения по Производителю и класу. Меню будет выпадающим с последующим выбором.

    MariaDB [smart_db]> SELECT t.term_id, t.name
    -> FROM wp_terms t
    -> JOIN wp_term_taxonomy tt ON t.term_id = tt.term_id
    tt.taxo -> WHERE tt.taxonomy = ‘nav_menu’;
    +———+—————————+
    | term_id | name |
    +———+—————————+
    | 7868 | For Her |
    | 7869 | For Him |
    | 7870 | Main Menu |
    | 7871 | Quick Links |
    | 7872 | Secondary Menu |
    | 7913 | Основное меню |
    | 7914 | New Menu |
    | 7915 | 777 |
    +———+—————————+

    MariaDB [smart_db]> SELECT r.object_id AS menu_item_id
    -> FROM wp_term_relationships r
    -> JOIN wp_term_taxonomy tt ON r.term_taxonomy_id = tt.term_taxonomy_id
    -> WHERE tt.term_id = 7913;
    Empty set (0,001 sec) и опять если вернутся к логам то меню не должно быть пустое…

    Посмотрите лог доступа и лог ошибок сайта после создания

    Меню wordpress должно быть создано из кактегорий товаров woocomerce сохраняя иерархию как они были созданы. Категорий 1500

    Предположу, что проблема связана с ограничением WordPress на количество пунктов меню.

    @kw56 это обычно при показе в админке происходит.

Просмотр 13 ответов — с 1 по 13 (всего 13)
  • Тема «В меню нет пунктов созданных через API» закрыта для новых ответов.