Magento2: Import product csv, if categories change, it's adding to the existing instead of replacing

Created on 22 Dec 2016  路  26Comments  路  Source: magento/magento2


Preconditions


  1. Version: Magento CE 2.1.2
  2. Environment: Php7, MariaDB, Varnish, Redis

Steps to reproduce

  1. Create a product with the native import and set the categories as "Root/Category1/Sub_cat1"
  2. Change the categories in the csv as "Root/Category2"
  3. Run a new import with the Add/Update attributes
    selection_274
    selection_275

Expected result

  1. The product now has two categories: "Root/Category1/Sub_cat1" & "Root/Category2"
  2. I would expect to have the product in the new category only instead of an addition.

Actual result

  1. The product should only appear in the category "Root/Category2"

Comments

There is the same issue with the picture, if I run multiple imports with different images, thus the product will have all the images as extra image and the one specified as base image (even if I only have 1 additional image)

Thank you

ImportExport Cannot Reproduce Format is valid bug report

Most helpful comment

Dear Super Magento team ( @veloraven ),

This bug is from December 2016. Could it be possible to fix it as soon as possible and stop waiting a year for bug updates ?

Thank you in advance
Matt

All 26 comments

Hi,

Why did you use Add/Update behavior instead of Replace?

How to replace products:

  1. Remove or empty columns store_view_code and _store from csv file. Because products can be replaced only in default scope.
  2. Run a new import with Replace behavior.
  3. Old products will be deleted and new will be added:

Notes:

  • only products with SKUs from your csv file will be replaced
  • new IDs will be generated for replaced products

Because he wanted to update a value as "Add/Update" would appear to be capable of to any reasonable person. If you're saying that the already useless import process that contains no documentation, awful validation is also incapable of this for one specific column...

Have you ever tried importing real products?

Hello, does anyone have solution for this? Very strange behaviour in my opinion. Using "replace" is very strange for such situation. Actualy this means, that i have to use replace function all the time. I guess it will cause problems with products returns and everything that is related with product id.

Any solution for this?

Dear Super Magento team ( @veloraven ),

This bug is from December 2016. Could it be possible to fix it as soon as possible and stop waiting a year for bug updates ?

Thank you in advance
Matt

@MattDelac, thank you for your report.
We were not able to reproduce this issue by following the steps you provided. If you'd like to update it, please reopen the issue.
We tested the issue on 2.3.0, 2.2.0, 2.1.9

This is not fixed in either 2.1.9 or 2.2.x. It appends categories indefinitely. Even if you wipe out the category field in the csv and import, the previously tagged categories will still be there. Using the "replace" method would be a very bad thing as it would be a brand new product and I'm guessing the customer reviews would not follow to the new product.

This really needs to be reopened.. if I import a product and assign it to category A, and then change my mind, and replace A with B in the import sheet, I expect the product to now be in category B. In reality the product is now in both A and B, which is not what anyone would want.

More specifically, if I first had A in the categories column, but now B, I would like it to update. If I first did not have a categories column at all, but then I imported another sheet with a categories column, I expect the categories data to be added. That's how I interpret the Add/Update functionality to work.

Hmm, from looking at the code, this seems like this is a feature, not a bug:

        if (Import::BEHAVIOR_APPEND != $this->getBehavior()) {
            $this->_connection->delete(
                $tableName,
                $this->_connection->quoteInto('product_id IN (?)', $delProductId)
            );
        }

Source: https://github.com/magento/magento2/blob/2.2-develop/app/code/Magento/CatalogImportExport/Model/Import/Product.php#L1343

I know I'll be patching this on my end.. Suggesting the replace method isn't great since it's very destructive on a live site. By changing the product IDs you'll be blasting away all customer carts, any re-order functionality, product/sales links, reports/statistics, etc.

@erfanimani - Did you come up with a patch for this? Thank you.

@sharmstr Unfortunately I didn't. I think I ended up deleting the category and reimported everything again.

From what I can remember, fixing the issue wasn't as straightforward as I thought initially...

@erfanimani I cant believe it works this way. I'll give fixing it a shot and report back. Thank you.

Getting this same error on magento2.2.2(latest version in today's date.)

@magento-engcom-team , Can you please update on the status of this issue. In which version it got fixed please share. The issue was reported on Dec 2016 and till now, every one getting same issue. Please reopen it and recheck it again.

Can't believe this is closed as 'can't reproduce'. It's very easy to reproduce.

I just experienced same issue with Magento 2.2.3 and, yes, it is quite easy to reproduce it. I can't believe that such issue last 2+ more years without fixes.

It does still exist for the latest CE 2.2.5 when will it be fixed?

I have created new issuse with better descirption which passed all tests and reproduced case. You can follow it here.

It's very discouraging that Magento can be this obtuse about this issue.

Hey guys,

i stepped into the same problem and solved it with a quite dirty workaorund. May you can use this too.
You have to overwrite the function "processRowCategories" in MagentoCatalogImportExportModelImportProduct. All the category links, which are not included in this script are deleted.

Take yourself the time to bind the sku and the categoryIds ^^ Ain't nobody have time for this :dancer:

/**
     * @param array $rowData
     * @return array
     */
    protected function processRowCategories($rowData)
    {
        $categoriesString = empty($rowData[self::COL_CATEGORY]) ? '' : $rowData[self::COL_CATEGORY];
        $categoryIds = [];
        if (!empty($categoriesString)) {
            $categoryIds = $this->categoryProcessor->upsertCategories(
                $categoriesString,
                $this->getMultipleValueSeparator()
            );

            // **** WORKAORUND START **** \\
            // This is a workaround for really updating the categories and not just simply add product to category
            $categoryNoDeleteIds = implode(",", $categoryIds);
            $deleteString = '
              delete
                ccp
              from
                catalog_category_product ccp
              left join
                catalog_product_entity cpe on ccp.product_id = cpe.entity_id
              where
                cpe.sku = "'. $rowData['sku'] . '"
              and
                ccp.category_id not in (' . $categoryNoDeleteIds .');';
            $this->_connection->query($deleteString);

            // **** WORKAROUND FINISH **** \\

            foreach ($this->categoryProcessor->getFailedCategories() as $error) {
                $this->errorAggregator->addError(
                    AbstractEntity::ERROR_CODE_CATEGORY_NOT_VALID,
                    ProcessingError::ERROR_LEVEL_NOT_CRITICAL,
                    $rowData['rowNum'],
                    self::COL_CATEGORY,
                    __('Category "%1" has not been created.', $error['category'])
                    . ' ' . $error['exception']->getMessage()
                );
            }
        }
        return $categoryIds;
    }

Any updates on this?

That's impressive.

The "fix" of @ulftietze works (I still don't know if it's a bug or a feature request). I used a plugin instead of his fix, but in the concept, it actually works.

This is really not a fix. That's just a dirty workaround for something i don't find an appropriate solution.

"fix" ^^

Was this page helpful?
0 / 5 - 0 ratings