From 2edf7c5b53528e2bcba83f13ba6a3795f89c9e01 Mon Sep 17 00:00:00 2001 From: Adam Date: Tue, 23 May 2023 11:12:36 +0100 Subject: [PATCH] fix: parent product cache not clearing --- .../Model/Indexer/Stock/CacheCleaner.php | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/app/code/Magento/CatalogInventory/Model/Indexer/Stock/CacheCleaner.php b/app/code/Magento/CatalogInventory/Model/Indexer/Stock/CacheCleaner.php index c5b71d9345804..e7b7ec0539361 100644 --- a/app/code/Magento/CatalogInventory/Model/Indexer/Stock/CacheCleaner.php +++ b/app/code/Magento/CatalogInventory/Model/Indexer/Stock/CacheCleaner.php @@ -128,7 +128,7 @@ private function getProductStockStatuses(array $productIds) $statuses = []; foreach ($this->getConnection()->fetchAll($select) as $item) { - $statuses[$item['product_id']] = $item; + $statuses[$item['product_id'].($item['parent_id']? '-'.$item['parent_id']: '')] = $item; } return $statuses; } @@ -142,27 +142,29 @@ private function getProductStockStatuses(array $productIds) */ private function getProductIdsForCacheClean(array $productStatusesBefore, array $productStatusesAfter) { - $disabledProductsIds = array_diff(array_keys($productStatusesBefore), array_keys($productStatusesAfter)); - $enabledProductsIds = array_diff(array_keys($productStatusesAfter), array_keys($productStatusesBefore)); - $commonProductsIds = array_intersect(array_keys($productStatusesBefore), array_keys($productStatusesAfter)); + $beforeProductIds = array_unique(array_column($productStatusesBefore, 'product_id')); + $afterProductIds = array_unique(array_column($productStatusesAfter, 'product_id')); + $disabledProductsIds = array_diff($beforeProductIds, $afterProductIds); + $enabledProductsIds = array_diff($afterProductIds, $beforeProductIds); + $commonRelations = array_intersect(array_keys($productStatusesBefore), array_keys($productStatusesAfter)); $productIds = array_merge($disabledProductsIds, $enabledProductsIds); $stockThresholdQty = $this->stockConfiguration->getStockThresholdQty(); - foreach ($commonProductsIds as $productId) { - $statusBefore = $productStatusesBefore[$productId]; - $statusAfter = $productStatusesAfter[$productId]; + foreach ($commonRelations as $commonRelationId) { + $statusBefore = $productStatusesBefore[$commonRelationId]; + $statusAfter = $productStatusesAfter[$commonRelationId]; if ($statusBefore['stock_status'] !== $statusAfter['stock_status'] || ($stockThresholdQty && $statusAfter['qty'] <= $stockThresholdQty)) { - $productIds[] = $productId; + $productIds[] = $statusAfter['product_id']; if (isset($statusAfter['parent_id'])) { $productIds[] = $statusAfter['parent_id']; } } } - return array_map('intval', $productIds); + return array_unique($productIds); } /**