cancel
Showing results for 
Search instead for 
Did you mean: 

Can a category's id as well as its parent id be changed?

Can a category's id as well as its parent id be changed?

I am experiencing an issue where i switched installations and the ids of most of my categories have changed. I need to adjust them. Is there any way it can be changed by running a php script while using magento functions and objects? I tried the following:

<?php
// Magento bootstrap
use Magento\Framework\App\Bootstrap;
use Magento\Framework\App\State;
use Magento\Catalog\Model\CategoryFactory;

require dirname(__DIR__) . '/app/bootstrap.php';

$bootstrap = Bootstrap::create(BP, $_SERVER);
$objectManager = $bootstrap->getObjectManager();
$state = $objectManager->get(State::class);
$state->setAreaCode('adminhtml');

$categoryFactory = $objectManager->get(CategoryFactory::class);

// IMPOSTAZIONE CATEGORIE
$categoryName = 'BAGNO'; // Categoria da trovare
$newCategoryId = 138; // Nuovo id
$newParentId = 2; // Nuovo parent id

// Load category by name
$category = $categoryFactory->create()->getCollection()
    ->addFieldToFilter('name', $categoryName)
    ->getFirstItem();

// Mostra errori
error_reporting(E_ALL);
ini_set('display_errors', 1);

// Check if category exists
if ($category->getId()) {
    try {
        // Start transaction
        $connection = $category->getResource()->getConnection();
        $connection->beginTransaction();

        // --lancia aggiornamento--
        echo "Prima: ";
        print_r($category->getData());

        echo '<br>';

	$attribute_set_id=$category->getData('attribute_set_id');
	$created_at=$category->getData('created_at');
	$updated_at=$category->getData('updated_at');
	$path=$category->getData('path');
	$position=$category->getData('position');
	$level=$category->getData('level');
	$children_count=$category->getData('children_count');
	$name=$category->getData('name');

 

        // Set new entity ID and parent ID
        $category->setData('attribute_set_id', $attribute_set_id);
        $category->setData('created_at', $created_at);
        $category->setData('updated_at', $updated_at);
        $category->setData('path', $path);
        $category->setData('position', $position);
        $category->setData('level', $level);
        $category->setData('children_count', $children_count);
        $category->setData('name', $name);
        $category->setData('entity_id',$newCategoryId);
        $category->setData('parent_id', $newParentId);

        // Save category
        $category->save();

        // Commit transaction
        $connection->commit();

        echo "Category '$categoryName' updated successfully with new ID: $newCategoryId and parent ID: $newParentId.";
    } catch (\Exception $e) {
        // Rollback transaction in case of error
        $connection->rollBack();
        echo "Error updating category: " . $e->getMessage();
    }
} else {
    echo "Category '$categoryName' not found.";
}

 

It never results in the data being updated in the database because of an error i get saying Error updating category: Rolled back transaction has not been completed correctly.

 

Thank you in advance if you are willing to help.