-
Notifications
You must be signed in to change notification settings - Fork 9.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
URL rewrites get wiped out for products w/ store-specific URL keys when saving categories #11078
Comments
@CNanninga, thank you for your report. |
Just informational, a long time ago we ran into similar problems (we still do, but work around them somehow) and I tried creating a PR, which seems to be related to the possible solution number 2 which @CNanninga suggests, but the PR wasn't very good as it broke stuff on other places, so I closed it. I can't remember all the details anymore, but maybe it helps somehow: #7667 |
@magento-engcom-team are any updates on this issue? it is open for more then a year... |
Hi @engcom-Echo. Thank you for working on this issue.
|
Hello All I am not able to reproduce this issue on the 2.4-develop branch by provided steps. Testing scenario: Preconditions:
Steps to reproduce:
Result
|
Preconditions
Store A Root
andStore B Root
)Store A Root -> Category 1
,Store B Root -> Category 2
)Steps to reproduce
has-special-key
) with the URL key "url-test-one", placing it in the categoriesStore A Root -> Category 1
andStore B Root -> Category 2
.has-special-key
and switch to the Store B view scope. Change the URL key to "url-test-one-override" and save.url_rewrite
now has at least two records forhas-special-key
:no-special-key
) with the URL key "url-test-two", placing it in the categoriesStore A Root -> Category 1
andStore B Root -> Category 2
.url_rewrite
now also has at least two records forno-special-key
:Store B Root -> Category 2
. Change the URL key in order to trigger regeneration of products belonging to the category, and save.Expected result
The
url_rewrite
table should still have the following records:has-special-key
:no-special-key
:Actual result
The
url_rewrite
table is missing the Store B record forhas-special-key
(the one that should have the request path "url-test-one-override.html").Details
This happens because of a combination of two factors:
Magento\CatalogUrlRewrite\Model\ProductScopeRewriteGenerator::generateForGlobalScope
contains a check for$this->storeViewService->doesEntityHaveOverriddenUrlKeyForStore
and does not proceed to generate rewrite paths for any store view where the URL key is different than the global scope. (Presumably because, the product model having been loaded at the default scope, it does not contain the appropriate values to generate rewrites for the given store.)Magento\UrlRewrite\Model\Storage\DbStorage::createFilterDataBasedOnUrls
uses the generated list of URL rewrites to be created to create an array of filters to use in deleting existing rewrite records. The filters simply specify entity IDs and store IDs.In the reproduction scenario outlined above: the check in
generateForGlobalScope
means no new URL rewrite records will be created forhas-special-key
in Store B, because it has an overriding URL key for that store. If that were the only product in the category being saved, we wouldn't have a problem. However,no-special-key
does not have an overriding URL key on Store B, so it does have new URL rewrite records for that store. And socreateFilterDataBasedOnUrls
ends up returning a filter array that will essentially say "delete all product rewrite records for SKUshas-special-key
andno-special-key
and for Store A and Store B.has-special-key
's rewrite record for Store B gets deleted, but no new record takes its place.Possible solutions
Two possible solutions are immediately apparent but have their own problems:
Magento\UrlRewrite\Model\Storage\DbStorage::createFilterDataBasedOnUrls
so that the format of the filter is more specific about combinations of products and stores that should be deleted. But this would require re-factoring all code that uses the results of this method.Magento\CatalogUrlRewrite\Model\ProductScopeRewriteGenerator::generateForGlobalScope
to avoid the check for an overriding URL key and allowgenerateForSpecificStoreView
to run regardless. Also modifygenerateForSpecificStoreView
to load up a new instance of the product in the right store scope, if the product's store scope doesn't match the passed store ID and if an overriding URL key exists. But if there are many such products with overriding URL keys on specific stores, this solution could result in unacceptable performance as many individual product loads are done.The text was updated successfully, but these errors were encountered: