Как правильно создавать иерархию категорий при импорте в mysql api?

Здравствуйте, пишу скрипт для импорта категорий из api в mysql

<?php
// Получаем данные с API
$json = file_get_contents('https://api.gdeslon.ru/gdeslon-categories.json');
$categories = json_decode($json, true);

// Подключение к базе данных
$host = '----';
$username = '----';
$password = '-----';
$dbname = '-----';

// Соединяемся с базой данных
$conn = mysqli_connect($host, $username, $password, $dbname);
// Меняю кодировку подключения к mysql
mysqli_query($conn, "SET NAMES utf8");

if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}

// Перебираем данные и добавляем их в базу данных
foreach ($categories as $category) {
    $term_id = $category['_id'];
    $parent = $category['parent_id'];
    $name = mysqli_real_escape_string($conn, $category['name']);
    $slug = strtolower(str_replace(' ', '-', $name));
    $path = trim($category['path'], '/');
    $api_id = $category['_id'];

    // Проверяем, существует ли категория с таким же slug
    $sql = "SELECT * FROM wp_terms WHERE slug = '$slug'";
    $result = mysqli_query($conn, $sql);

    // Если категория уже существует, обновляем её данные
    if (mysqli_num_rows($result) > 0) {
        $row = mysqli_fetch_assoc($result);
        $term_id = $row['term_id'];
        $sql = "UPDATE wp_terms SET name = '$name' WHERE term_id = $term_id";
        mysqli_query($conn, $sql);
        echo "Категория со слагом $slug уже существует. обновлено.<br>";
    } else {
        // Вставляем новую категорию
        $sql = "INSERT INTO wp_terms (term_id, name, slug) VALUES ($term_id, '$name', '$slug')";
        if (mysqli_query($conn, $sql) === TRUE) {
            $term_id = mysqli_insert_id($conn);
            if ($parent != 0) {
                $sql = "INSERT INTO wp_term_relationships (object_id, term_taxonomy_id) VALUES ($parent, $term_id)";
                mysqli_query($conn, $sql);
            }
            $sql = "INSERT INTO wp_term_taxonomy (term_id, taxonomy, parent) VALUES ($term_id, 'product_cat', $parent)";
            mysqli_query($conn, $sql);
            $term_taxonomy_id = mysqli_insert_id($conn);
            $sql = "INSERT INTO wp_termmeta (term_id, meta_key, meta_value) VALUES ($term_id, 'thumbnail_id', '')";
            mysqli_query($conn, $sql);
            echo "Category with ID $term_id added successfully.<br>";
        } else {
            echo "Error adding category: " . mysqli_error($conn) . "<br>";
        }
    }
}

// Закрываем соединение с базой данных
mysqli_close($conn);
?>


Почему то не как не хочет строится иерархия категорий id parent_id

Часть логов

Error adding category: Duplicate entry '1' for key 'PRIMARY'
Error adding category: Duplicate entry '2' for key 'PRIMARY'
Error adding category: Duplicate entry '3' for key 'PRIMARY'
Error adding category: Duplicate entry '5' for key 'PRIMARY'
Error adding category: Duplicate entry '6' for key 'PRIMARY'
Error adding category: Duplicate entry '8' for key 'PRIMARY'
Error adding category: Duplicate entry '10' for key 'PRIMARY'
Error adding category: Duplicate entry '13' for key 'PRIMARY'
Error adding category: Duplicate entry '14' for key 'PRIMARY'
Категория со слагом Картины уже существует. обновлено.
Категория со слагом Сувениры уже существует. обновлено.
Категория со слагом Подарочные-наборы уже существует. обновлено.
Категория со слагом Масштабные-модели уже существует. обновлено.
Категория со слагом Иконы уже существует. обновлено.
Категория со слагом Подарочные-свечи уже существует. обновлено.
Категория со слагом Подарки уже существует. обновлено.


Во вкладке категорий они отсутствуют

6435036b66fd6129829153.jpeg
При создание товаров присутствуют, без иерархии.
643503fb259ce569047964.jpeg
  • Вопрос задан
  • 76 просмотров
Пригласить эксперта
Ответы на вопрос 1
YBB
@YBB
У Вас стоит проверка существования по слагу, а insert делается с жестко заданным id. Даже если бы таблица wp_terms содержала только импортируемые данные (что не так), такая проверка, по большому счету, некорректна.

Таблица wp_term_relationships связывает записи (object_id) с термами (term_taxonomy_id), а Вы зачем-то пытаетесь туда внести $parent - id родительского терма.

См. Описание структуры базы данных « WordPress Codex
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы