Tôi đang cố gắng cập nhật giá cho nhiều sản phẩm (hơn 10.000). Cách tôi đang làm điều đó ngay bây giờ là vô cùng tốn thời gian. Đó là cách tốt nhất để lặp qua tất cả các sản phẩm và cập nhật hầu hết chúng?
Cảm ơn
Tôi đang cố gắng cập nhật giá cho nhiều sản phẩm (hơn 10.000). Cách tôi đang làm điều đó ngay bây giờ là vô cùng tốn thời gian. Đó là cách tốt nhất để lặp qua tất cả các sản phẩm và cập nhật hầu hết chúng?
Cảm ơn
Câu trả lời:
Hi Magento cung cấp một thuộc tính bằng mã bên dưới
$product->setAttributeCode($newValue)
$ProductObject->getResource()->saveAttribute($product, 'attribute_Code');
$product=Mage::getModel('catalog/product')->load($id);
$product->setSpecialFromDate('2010-10-28');
// below code use for time format
$product->setSpecialFromDateIsFormated(true);
$product->getResource()->saveAttribute($product, 'special_from_date');
$productIds = array(1,3,2);
$products = Mage::getModel('catalog/product')->getCollection()
->addAttributeToFilter('entity_id', array('in' => $productIds));
foreach($products as $product)
{
$product->setSpecialFromDate('2010-10-28');
// below code use for time format
$product->setSpecialFromDateIsFormated(true);
$product->getResource()->saveAttribute($product, 'special_from_date');
}
Mage::getSingleton('catalog/product_api')->update();
và Mage::getSingleton('catalog/product_action')->updateAttributes()
. Product_api mất 1,7 giây trên avg và Product_action mất 1,0 giây trên avg. tuy nhiên, $product->getResource()->saveAttribute()
mất trên 0,04 giây trên avg. Cảm ơn!
$product->getResource()->saveAttribute
hành động. CÁM ƠN!!
Viết một truy vấn SQL.
Cách tốt nhất thứ hai (và cách tôi khuyên dùng): \Mage_Catalog_Model_Resource_Product_Action::updateAttributes
Mã ví dụ của u_maxx:
$allProductIds = Mage::getModel('catalog/product')->getCollection()->getAllIds();
$attributeCode = 'some_eav_attribute';
$attributeValue = NULL;
$attrData = array( $attributeCode => $attributeValue );
$storeId = 0;
// no reindex:<
Mage::getSingleton('catalog/resource_product_action')->updateAttributes($allProductIds, $attrData, $storeId);
// reindex:
Mage::getModel('catalog/product_action')->updateAttributes($allProductIds, $attrData, $storeId);
Làm thế nào điều này sẽ làm việc với các giá trị multiselect? Liệu nó 'thêm' giá trị hoặc ghi đè lên các giá trị được chọn trước khác
Nhiều lựa chọn thường được lưu dưới dạng số nguyên được phân tách bằng dấu phẩy, như 27,42,4711
. Do đó, nếu bạn thay đổi giá trị để nói 1
, các giá trị khác sẽ bị mất. Nhưng những gì bạn có thể làm là một cái gì đó như CONCAT(value, ',1')
có nghĩa là thêm giá trị mới vào cuối, được phân tách bằng dấu phẩy. Tôi nghĩ ngay cả khi bạn thêm một giá trị hai lần, điều này không có vấn đề gì, vì Magento sẽ lọc nó vào lần tiếp theo mục được lưu và bỏ qua giá trị thứ hai.
<?php $allProductIds = Mage::getModel('catalog/product')->getCollection()->getAllIds(); $attributeCode = 'some_eav_attribute'; $attributeValue = NULL; $attrData = array( $attributeCode => $attributeValue ); $storeId = 0; Mage::getSingleton('catalog/resource_product_action')->updateAttributes($allProductIds, $attrData, $storeId);
Mage::getSingleton('catalog/resource_product_action')
để Mage::getModel('catalog/product_action')
có các thông số chính xác cùng đề cập ở trên.
Sản phẩm 10k, sử dụng SQL. EAV chỉ làm vẩn đục nước. Mỗi câu hỏi là cách nhanh nhất.
Tìm thuộc tính_id
SELECT * FROM eav_attribute where entity_type_id = 4 and attribute_code = 'YOUR_ATTRIBUTE_CODE_HERE'
Cập nhật với tìm thấy attribute_id
từ truy vấn trên.
UPDATE catalog_product_entity_int SET value = 1 WHERE attribute_id = FOUND_ATTRIBUTE_ID
Tôi cho rằng bạn có thể thực hiện một mục phụ với bản cập nhật nhưng để đơn giản vì hai truy vấn SQL dễ nắm bắt nhất.
LƯU Ý: entity_type_id = 4
hầu hết luôn là các mục EAV của sản phẩm. Trong trường hợp bạn cần cập nhật hàng loạt danh mục hoặc thuộc tính khách hàng, điều này sẽ khác nhau cũng như bảng được cập nhật dựa trên loại thuộc tính mà nó đang cập nhật. Ngoài ra nếu bạn có thiết lập nhiều cửa hàng, hãy chắc chắn và lưu ý và điều kiệnstore_id
Hơn nữa với câu trả lời của Fabian ở trên, bạn có thể cập nhật nhiều trường cùng một lúc. Ví dụ dưới đây chỉ có 2 (trong kho, trạng thái chứng khoán), nhưng bạn có thể sử dụng bao nhiêu tùy thích.
$product_ids = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToFilter('status', array('eq' => 2)) //only disabled
->getAllIds();
$attrData = [
['attribute_one' => 1],
['attribute_two' => 1]
];
$storeId = 0;
Mage::getSingleton('catalog/resource_product_action')
->updateAttributes($product_ids, $attrData, $storeId);