Configurable options disappearing from front end after stock status re-index
-
12-12-2019 - |
Question
I have a custom import routine that creates configurable products and assigns children to them. These appear on the front end without issue until I manually run the stock status re-index.
I've done a snapshot from before and after the re-index and there is one table changing which is cataloginventory_stock_status
where the stock_status
column is changed from 1
(when it does appear) to 0
(now not appearing) for my configurable parent.
Can anyone explain this behaviour or know how to fix it?
Just to clarify, re-syncing my product which calls the following code:
$stockStatus = Mage::getModel('cataloginventory/stock_status');
$stockStatus->assignProduct($product);
$stockStatus->saveProductStatus($product->getId(), 1);
makes the options appear again until the next status re-index.
Solution 2
It turns out when importing the configurable parent I was skipping some code that put an entry into cataloginventory_stock_item
which caused the stock_status
to be set to 0
when the re-index process was run. With that in mind, we need to make sure a configurable parent has an item i.e:
$stockItem = Mage::getModel('cataloginventory/stock_item');
$stockItem->assignProduct($product);
$stockItem->setData('stock_id', 1);
$stockItem->setData('qty', $stockLevel);
$stockItem->setData('use_config_min_qty', 1);
$stockItem->setData('use_config_backorders', 1);
$stockItem->setData('min_sale_qty', 1);
$stockItem->setData('use_config_min_sale_qty', 1);
$stockItem->setData('use_config_max_sale_qty', 1);
$stockItem->setData('is_in_stock', ($isInStock) ? 1 : 0);
$stockItem->setData('use_config_notify_stock_qty', 1);
$stockItem->setData('use_config_manage_stock', 0);
$stockItem->setData('manage_stock', ($this->getPropS($kcStockItem, 'STOCK_CONTROLLED') == '-1') ? 1 : 0);
$stockItem->setData('backorders', $backorderVal);
$stockItem->setData('use_config_backorders', "0");
$stockItem->save();
OTHER TIPS
I have run into this problem when importing stock status via the API method. What I had to do was patch the core by rewriting a core module. Mage_Catalog_Model_Resource_Product_Status::getProductStatus()
has a bug in it which incorrectly loads up the child statuses. In order to fix this bug, I replaced the $select assignment in the else statement of this method with
$select = $adapter->select()
->from(
array('t1' => $attributeTable),
'')
->joinLeft(
array('t2' => $attributeTable),
't1.entity_id = t2.entity_id AND t1.attribute_id = t2.attribute_id AND t2.store_id = ' . (int)$storeId,
array('t1.entity_id')
)
->columns(array('value' => $valueCheckSql))
->where('t1.store_id = ?', Mage_Core_Model_App::ADMIN_STORE_ID)
->where('t1.attribute_id = ?', $attribute->getAttributeId())
->where('t1.entity_id IN(?)', $productIds);
Make sure that you do this by overriding the Mage_Catalog_Model_Resource_Product_Status::getProductStatus()
method to accomplish this so that you are not modifying the core directly.