6 declare(strict_types=1);
13 use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory;
22 use Magento\UrlRewrite\Model\MergeDataProviderFactory;
64 private $categoryBasedProductRewriteGenerator;
69 private $mergeDataProviderPrototype;
79 private $productScopeRewriteGenerator;
99 MergeDataProviderFactory $mergeDataProviderFactory =
null,
100 Json $serializer =
null,
108 $this->categoryBasedProductRewriteGenerator = $categoryBasedProductRewriteGenerator;
111 $mergeDataProviderFactory = $mergeDataProviderFactory ?:
$objectManager->get(MergeDataProviderFactory::class);
112 $this->mergeDataProviderPrototype = $mergeDataProviderFactory->create();
113 $this->serializer = $serializer ?:
$objectManager->get(Json::class);
114 $this->productScopeRewriteGenerator = $productScopeRewriteGenerator
126 $mergeDataProvider = clone $this->mergeDataProviderPrototype;
127 $this->isSkippedProduct[
$category->getEntityId()] = [];
128 $saveRewriteHistory = (bool)
$category->getData(
'save_rewrites_history');
132 $this->generateChangedProductUrls($mergeDataProvider,
$category,
$storeId, $saveRewriteHistory);
134 $mergeDataProvider->merge(
135 $this->getCategoryProductsUrlRewrites(
144 foreach ($this->childrenCategoriesProvider->getChildren(
$category,
true) as $childCategory) {
145 $mergeDataProvider->merge(
146 $this->getCategoryProductsUrlRewrites(
155 return $mergeDataProvider->getData();
164 $categoryIds = $this->childrenCategoriesProvider->getChildrenIds(
$category,
true);
166 foreach ($categoryIds as $categoryId) {
167 $this->urlPersist->deleteByData(
175 $this->urlPersist->deleteByData(
178 $this->serializer->serialize([
'category_id' => $categoryId]),
193 private function getCategoryProductsUrlRewrites(
199 $mergeDataProvider = clone $this->mergeDataProviderPrototype;
206 ->addAttributeToSelect(
'name')
207 ->addAttributeToSelect(
'visibility')
208 ->addAttributeToSelect(
'url_key')
209 ->addAttributeToSelect(
'url_path');
212 if (isset($this->isSkippedProduct[
$category->getEntityId()]) &&
219 $product->setData(
'save_rewrites_history', $saveRewriteHistory);
220 $mergeDataProvider->merge(
225 return $mergeDataProvider->getData();
237 private function generateChangedProductUrls(
238 MergeDataProvider $mergeDataProvider,
241 bool $saveRewriteHistory
243 $this->isSkippedProduct[
$category->getEntityId()] =
$category->getAffectedProductIds();
247 if ($this->productScopeRewriteGenerator->isGlobalScope(
$storeId)) {
248 $categoryStoreIds = $this->getCategoryStoreIds(
$category);
251 foreach ($categoryStoreIds as $categoryStoreId) {
253 $collection = $this->productCollectionFactory->create()
254 ->setStoreId($categoryStoreId)
255 ->addIdFilter(
$category->getAffectedProductIds())
256 ->addAttributeToSelect(
'visibility')
257 ->addAttributeToSelect(
'name')
258 ->addAttributeToSelect(
'url_key')
259 ->addAttributeToSelect(
'url_path');
264 while ($currentPage <= $pageCount) {
267 $product->setData(
'save_rewrites_history', $saveRewriteHistory);
268 $product->setStoreId($categoryStoreId);
269 $mergeDataProvider->merge(
285 private function getCategoryStoreIds(Category
$category): array
288 return array_filter($ids);
$categoryUrlRewriteGenerator
$productUrlRewriteGenerator
deleteCategoryRewritesForChildren(Category $category)
$productCollectionFactory
$childrenCategoriesProvider
generateProductUrlRewrites(Category $category)
__construct(ChildrenCategoriesProvider $childrenCategoriesProvider, CategoryUrlRewriteGenerator $categoryUrlRewriteGenerator, ProductUrlRewriteGenerator $productUrlRewriteGenerator, UrlPersistInterface $urlPersist, CollectionFactory $productCollectionFactory, CategoryProductUrlPathGenerator $categoryBasedProductRewriteGenerator, MergeDataProviderFactory $mergeDataProviderFactory=null, Json $serializer=null, ProductScopeRewriteGenerator $productScopeRewriteGenerator=null)