55 */
66namespace Magento \CatalogUrlRewrite \Model ;
77
8+ use Magento \Catalog \Api \CategoryRepositoryInterface ;
89use Magento \Catalog \Model \Category ;
910use Magento \Catalog \Model \Product ;
11+ use Magento \CatalogUrlRewrite \Model \Product \AnchorUrlRewriteGenerator ;
1012use Magento \CatalogUrlRewrite \Model \Product \CanonicalUrlRewriteGenerator ;
1113use Magento \CatalogUrlRewrite \Model \Product \CategoriesUrlRewriteGenerator ;
1214use Magento \CatalogUrlRewrite \Model \Product \CurrentUrlRewritesRegenerator ;
13- use Magento \CatalogUrlRewrite \Model \Product \AnchorUrlRewriteGenerator ;
1415use Magento \CatalogUrlRewrite \Service \V1 \StoreViewService ;
16+ use Magento \Framework \App \ObjectManager ;
1517use Magento \Store \Model \Store ;
1618use Magento \Store \Model \StoreManagerInterface ;
1719use Magento \UrlRewrite \Model \MergeDataProviderFactory ;
18- use Magento \Framework \App \ObjectManager ;
1920
2021/**
2122 * Class ProductScopeRewriteGenerator
@@ -63,6 +64,11 @@ class ProductScopeRewriteGenerator
6364 */
6465 private $ mergeDataProviderPrototype ;
6566
67+ /**
68+ * @var CategoryRepositoryInterface
69+ */
70+ private $ categoryRepository ;
71+
6672 /**
6773 * @param StoreViewService $storeViewService
6874 * @param StoreManagerInterface $storeManager
@@ -72,6 +78,7 @@ class ProductScopeRewriteGenerator
7278 * @param CurrentUrlRewritesRegenerator $currentUrlRewritesRegenerator
7379 * @param AnchorUrlRewriteGenerator $anchorUrlRewriteGenerator
7480 * @param \Magento\UrlRewrite\Model\MergeDataProviderFactory|null $mergeDataProviderFactory
81+ * @param CategoryRepositoryInterface|null $categoryRepository
7582 */
7683 public function __construct (
7784 StoreViewService $ storeViewService ,
@@ -81,7 +88,8 @@ public function __construct(
8188 CategoriesUrlRewriteGenerator $ categoriesUrlRewriteGenerator ,
8289 CurrentUrlRewritesRegenerator $ currentUrlRewritesRegenerator ,
8390 AnchorUrlRewriteGenerator $ anchorUrlRewriteGenerator ,
84- MergeDataProviderFactory $ mergeDataProviderFactory = null
91+ MergeDataProviderFactory $ mergeDataProviderFactory = null ,
92+ CategoryRepositoryInterface $ categoryRepository = null
8593 ) {
8694 $ this ->storeViewService = $ storeViewService ;
8795 $ this ->storeManager = $ storeManager ;
@@ -94,6 +102,8 @@ public function __construct(
94102 $ mergeDataProviderFactory = ObjectManager::getInstance ()->get (MergeDataProviderFactory::class);
95103 }
96104 $ this ->mergeDataProviderPrototype = $ mergeDataProviderFactory ->create ();
105+ $ this ->categoryRepository = $ categoryRepository ?:
106+ ObjectManager::getInstance ()->get (CategoryRepositoryInterface::class);
97107 }
98108
99109 /**
@@ -150,10 +160,14 @@ public function generateForSpecificStoreView($storeId, $productCategories, Produ
150160 $ mergeDataProvider = clone $ this ->mergeDataProviderPrototype ;
151161 $ categories = [];
152162 foreach ($ productCategories as $ category ) {
153- if ($ this ->isCategoryProperForGenerating ($ category , $ storeId )) {
154- $ categories [] = $ category ;
163+ if (! $ this ->isCategoryProperForGenerating ($ category , $ storeId )) {
164+ continue ;
155165 }
166+
167+ // category should be loaded per appropriate store if category's URL key has been changed
168+ $ categories [] = $ this ->getCategoryWithOverriddenUrlKey ($ storeId , $ category );
156169 }
170+
157171 $ productCategories = $ this ->objectRegistryFactory ->create (['entities ' => $ categories ]);
158172
159173 $ mergeDataProvider ->merge (
@@ -199,4 +213,26 @@ public function isCategoryProperForGenerating(Category $category, $storeId)
199213 }
200214 return false ;
201215 }
216+
217+ /**
218+ * Checks if URL key has been changed for provided category and returns reloaded category,
219+ * in other case - returns provided category.
220+ *
221+ * @param $storeId
222+ * @param Category $category
223+ * @return Category
224+ */
225+ private function getCategoryWithOverriddenUrlKey ($ storeId , Category $ category )
226+ {
227+ $ isUrlKeyOverridden = $ this ->storeViewService ->doesEntityHaveOverriddenUrlKeyForStore (
228+ $ storeId ,
229+ $ category ->getEntityId (),
230+ Category::ENTITY
231+ );
232+
233+ if (!$ isUrlKeyOverridden ) {
234+ return $ category ;
235+ }
236+ return $ this ->categoryRepository ->get ($ category ->getEntityId (), $ storeId );
237+ }
202238}
0 commit comments