55 */
66namespace Magento \CatalogUrlRewrite \Observer ;
77
8+ use Magento \Catalog \Api \Data \ProductInterface ;
89use Magento \Catalog \Model \Product ;
9- use Magento \Catalog \Model \ProductRepository ;
10+ use Magento \Catalog \Model \Product \Visibility ;
11+ use Magento \Catalog \Model \ResourceModel \Product \Collection ;
1012use Magento \CatalogUrlRewrite \Model \ProductScopeRewriteGenerator ;
1113use Magento \CatalogUrlRewrite \Model \ProductUrlPathGenerator ;
1214use Magento \CatalogUrlRewrite \Model \ProductUrlRewriteGenerator ;
1315use Magento \Framework \Event \Observer ;
14- use Magento \Framework \Exception \NoSuchEntityException ;
1516use Magento \UrlRewrite \Model \Exception \UrlAlreadyExistsException ;
1617use Magento \UrlRewrite \Model \Storage \DeleteEntitiesFromStores ;
1718use Magento \UrlRewrite \Model \UrlPersistInterface ;
1819use Magento \Framework \Event \ObserverInterface ;
1920use Magento \Store \Model \StoreManagerInterface ;
20- use Magento \Store \Api \StoreWebsiteRelationInterface ;
2121
2222/**
2323 * Class ProductProcessUrlRewriteSavingObserver
2929class ProductProcessUrlRewriteSavingObserver implements ObserverInterface
3030{
3131 /**
32- * @var ProductUrlRewriteGenerator $productUrlRewriteGenerator
32+ * @var ProductUrlRewriteGenerator
3333 */
3434 private $ productUrlRewriteGenerator ;
3535
3636 /**
37- * @var UrlPersistInterface $urlPersist
37+ * @var UrlPersistInterface
3838 */
3939 private $ urlPersist ;
4040
4141 /**
42- * @var ProductUrlPathGenerator $productUrlPathGenerator
42+ * @var ProductUrlPathGenerator
4343 */
4444 private $ productUrlPathGenerator ;
4545
4646 /**
47- * @var StoreManagerInterface $storeManager
47+ * @var StoreManagerInterface
4848 */
4949 private $ storeManager ;
5050
5151 /**
52- * @var StoreWebsiteRelationInterface $storeWebsiteRelation
52+ * @var ProductScopeRewriteGenerator
5353 */
54- private $ storeWebsiteRelation ;
55-
56- /**
57- * @var ProductRepository $productRepository
58- */
59- private $ productRepository ;
54+ private $ productScopeRewriteGenerator ;
6055
6156 /**
62- * @var ProductScopeRewriteGenerator $productScopeRewriteGenerator
57+ * @var DeleteEntitiesFromStores
6358 */
64- private $ productScopeRewriteGenerator ;
59+ private $ deleteEntitiesFromStores ;
6560
6661 /**
67- * @var DeleteEntitiesFromStores $deleteEntitiesFromStores
62+ * @var Collection
6863 */
69- private $ deleteEntitiesFromStores ;
64+ private $ productCollection ;
7065
7166 /**
7267 * @param ProductUrlRewriteGenerator $productUrlRewriteGenerator
7368 * @param UrlPersistInterface $urlPersist
7469 * @param ProductUrlPathGenerator $productUrlPathGenerator
7570 * @param StoreManagerInterface $storeManager
76- * @param StoreWebsiteRelationInterface $storeWebsiteRelation
77- * @param ProductRepository $productRepository
7871 * @param ProductScopeRewriteGenerator $productScopeRewriteGenerator
7972 * @param DeleteEntitiesFromStores $deleteEntitiesFromStores
73+ * @param Collection $productCollection
8074 */
8175 public function __construct (
8276 ProductUrlRewriteGenerator $ productUrlRewriteGenerator ,
8377 UrlPersistInterface $ urlPersist ,
8478 ProductUrlPathGenerator $ productUrlPathGenerator ,
8579 StoreManagerInterface $ storeManager ,
86- StoreWebsiteRelationInterface $ storeWebsiteRelation ,
87- ProductRepository $ productRepository ,
8880 ProductScopeRewriteGenerator $ productScopeRewriteGenerator ,
89- DeleteEntitiesFromStores $ deleteEntitiesFromStores
81+ DeleteEntitiesFromStores $ deleteEntitiesFromStores ,
82+ Collection $ productCollection
9083 ) {
9184 $ this ->productUrlRewriteGenerator = $ productUrlRewriteGenerator ;
9285 $ this ->urlPersist = $ urlPersist ;
9386 $ this ->productUrlPathGenerator = $ productUrlPathGenerator ;
9487 $ this ->storeManager = $ storeManager ;
95- $ this ->storeWebsiteRelation = $ storeWebsiteRelation ;
96- $ this ->productRepository = $ productRepository ;
9788 $ this ->productScopeRewriteGenerator = $ productScopeRewriteGenerator ;
9889 $ this ->deleteEntitiesFromStores = $ deleteEntitiesFromStores ;
90+ $ this ->productCollection = $ productCollection ;
9991 }
10092
10193 /**
@@ -104,8 +96,6 @@ public function __construct(
10496 * @param Observer $observer
10597 * @return void
10698 * @throws UrlAlreadyExistsException
107- * @throws NoSuchEntityException
108- * @SuppressWarnings(PHPMD.CyclomaticComplexity)
10999 */
110100 public function execute (Observer $ observer )
111101 {
@@ -125,29 +115,31 @@ public function execute(Observer $observer)
125115 }
126116
127117 $ storeIdsToRemove = [];
118+ $ productWebsiteMap = array_flip ($ product ->getWebsiteIds ());
119+ $ storeVisibilities = $ this ->productCollection ->getAllAttributeValues (ProductInterface::VISIBILITY );
128120 if ($ this ->productScopeRewriteGenerator ->isGlobalScope ($ product ->getStoreId ())) {
129121 //Remove any rewrite URLs for websites the product is not in, or is not visible in. Global Scope.
130- foreach ($ this ->storeManager ->getWebsites () as $ website ) {
131- $ websiteId = $ website ->getWebsiteId ();
132- foreach ($ this ->storeWebsiteRelation ->getStoreByWebsiteId ($ websiteId ) as $ storeid ) {
133- //Load the product for the store we are processing so we can see if it is visible
134- $ storeProduct = $ this ->productRepository ->getById (
135- $ product ->getId (),
136- false ,
137- $ storeid ,
138- true
139- );
140- if (!$ storeProduct ->isVisibleInSiteVisibility () ||
141- !in_array ($ websiteId , $ product ->getWebsiteIds ())) {
142- $ storeIdsToRemove [] = $ storeid ;
143- };
122+ foreach ($ this ->storeManager ->getStores () as $ store ) {
123+ $ websiteId = $ store ->getWebsiteId ();
124+ $ storeId = $ store ->getStoreId ();
125+ if (!isset ($ productWebsiteMap [$ websiteId ])) {
126+ $ storeIdsToRemove [] = $ storeId ;
127+ continue ;
128+ }
129+ //Check the visibility of the product in each store.
130+ if (isset ($ storeVisibilities [$ product ->getId ()][$ storeId ])
131+ && ($ storeVisibilities [$ product ->getId ()][$ storeId ] === Visibility::VISIBILITY_NOT_VISIBLE )) {
132+ $ storeIdsToRemove [] = $ storeId ;
144133 }
145134 }
146135 } else {
147136 //Only remove rewrite for current scope
148- if (!$ product ->isVisibleInSiteVisibility () ||
149- !in_array ($ product ->getStoreId (), $ product ->getStoreIds ())) {
150- $ storeIdsToRemove [] = $ product ->getStoreId ();
137+ $ websiteId = $ product ->getStore ()->getWebsiteId ();
138+ $ storeId = $ product ->getStoreId ();
139+ if (!isset ($ productWebsiteMap [$ websiteId ]) ||
140+ (isset ($ storeVisibilities [$ product ->getId ()][$ storeId ])
141+ && ($ storeVisibilities [$ product ->getId ()][$ storeId ] === Visibility::VISIBILITY_NOT_VISIBLE ))) {
142+ $ storeIdsToRemove [] = $ storeId ;
151143 }
152144 }
153145 if (count ($ storeIdsToRemove )) {
0 commit comments