In Magento 2, updating product attributes can sometimes be tricky. By default, when you save a product, Magento attempts to update all attributes, which can cause performance issues. For example, saving a single product with all attributes may take 40–50 seconds. If you only need to update one attribute, there’s a faster and more efficient way.
Problem with Full Product Save
Using $product->save() or productRepository->save() updates the entire product object. This is resource‑intensive and unnecessary if you only want to change one attribute.
Example (not recommended):
$item->setWidth(10);
$item->save();
This approach saves the entire product, not just the width attribute.
Solution: Use updateAttributes()
Magento provides the updateAttributes() method in Magento\Catalog\Model\Product\Action to update specific attributes directly. This method is much faster and avoids saving the whole product.
Example Code
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$productAction = $objectManager->get('Magento\Catalog\Model\Product\Action');
$productAction->updateAttributes(
[$item->getId()],
['width' => 10],
$storeId
);
Here’s what each parameter means:
- $productIds → Array of product IDs to update.
- $attrData → Key‑value pairs of attribute codes and values.
- $storeId → Store view ID where the attribute should be updated.
Another Example
$this->action->updateAttributes(
[$productObj->getId()],
['your_attribute_code' => 'your_value'],
$storeId
);
Performance Benefits
- Updates only the required attribute.
- Reduces execution time significantly compared to full product save.
- Prevents unnecessary reindexing of unrelated attributes.
Best Practices
- Use
updateAttributes()for bulk updates (e.g., changing prices or stock status for multiple products). - Always specify the correct
storeIdto avoid overwriting values in unintended store views. - Log changes for debugging and auditing purposes.
- Test updates in a staging environment before applying to production.
Conclusion
Instead of saving the entire product object, use updateAttributes() to update only the required attribute. This method is faster, safer, and more efficient, especially when dealing with large catalogs. By following this approach, you can optimize your Magento 2 store’s performance and reduce unnecessary overhead.
Happy Coding & Optimizing!