Description
There are a number of conditions where the entries in the url_rewrite table can conflict sometimes silently failing to update the rewrites, sometimes showing links to unexpected conflicts and sometimes linking to conflicts that do not exist.
Preconditions
- Magento 2.2.5
- PHP 7.1.20
- MySQL 5.7.23
Steps to reproduce
Initial setup
- composer create-project --repository-url=https://repo.magento.com/ magento/project-community-edition {install dir}
- cd {install dir}
- ./bin/magento setup:install --backend-frontname=? --db-host=? --db-name=? --db-user=? --db-password=? --base-url=? --admin-user=? --admin-password=? --admin-email=? --admin-firstname=? --admin-lastname=?
- ./bin/magento deploy:mode:set developer
- ./bin/magento app:config:dump
- ./bin/magento cache:disable
Scenario one
Updating the value of "catalog/seo/category_url_suffix" can cause Magento to silently fail to update the entries in the url_rewrite table for a specific category
- Perform the steps described in "Initial setup"
- Confirm that the value for "catalog/seo/category_url_suffix" is ".html" (the default value)
- Proceed to the admin panel and create a sub-category called "Sale" with the URL key of "sale"
- Create a sub-category under "Sale" called "Sandwiches" with the URL key of "sandwiches"
- Now update the name of the new category from "Sandwiches" to "Sandwiches Old" (NOTE: This step is just to simulate user behaviour and highlight the potential of conflicts when importing data)
- Update the value of "catalog/seo/category_url_suffix" to ".php" and run "./bin/magento app:config:import"
- Create another sub-category under "Sale" called "Sandwiches" with the URL key of "sandwiches"
- Update the value of "catalog/seo/category_url_suffix" to ".test" and run "./bin/magento app:config:import"
- Update the URL key for the "Sale" category from "sale" to "sale-test"
Scenario two
Updating the values of "catalog/seo/product_url_suffix", "catalog/seo/category_url_suffix" and "catalog/seo/product_use_categories" can cause Magento to fail to update the entries in the url_rewrite table while showing an error with a link to a non-existent rewrite.
- Perform the steps described in "Initial setup"
- Confirm that the values for "catalog/seo/product_url_suffix" and "catalog/seo/category_url_suffix" are ".html" and the value for "catalog/seo/product_use_categories" is "0" (the default values)
- Proceed to the admin panel and create a sub-category called "Sale" with the URL key of "sale"
- Create a sub-category under "Sale" called "Sandwiches" with the URL key of "sandwiches"
- Update the value of "catalog/seo/product_url_suffix" and "catalog/seo/category_url_suffix" to ".php" and run "./bin/magento app:config:import"
- Create a product called "Sandwiches" with the URL key of "sandwiches" and add it to the "Sale" category
- Update the values for "catalog/seo/product_url_suffix" and "catalog/seo/category_url_suffix" to ".test", the value for "catalog/seo/product_use_categories" to "1" and run "./bin/magento app:config:import"
- Update the URL key for the "Sale" category from "sale" to "sale-test"
Scenario three
Scenario three is essentially combinations of the procedures in scenarios one and two except where a valid link to the matching url_rewrite entry is displayed.
This scenario causes a number of issues with the import process but that will have to be reported as a separate bug.
Expected result
Scenario one
The URL keys for categories should never have been allowed to conflict like this and at the very least a warning notifying the admin user of conflicts in the url_rewrite table should be shown.
Scenario two
Same as scenario one except that there should be a much better way of managing URL rewrite conflicts.
Scenario three
Essentially the same as scenario one
Actual result
Scenario one
A success message saying "You saved the category." is displayed to the admin user.
Scenario two
An error stating tho following is displayed:
The value specified in the URL Key field would generate a URL that already exists.
To resolve this conflict, you can either change the value of the URL Key field (located in the Search Engine Optimization section) to a unique value, or change the Request Path fields in all locations listed below:
- sale-test/sandwiches.test
The link "sale-test/sandwiches.test" points to a record in the url_rewrite table that doesn't exist as the transaction that contained the insert for this entry was rolled back.
Scenario three
Unexpected URL conflicts are shown