Найшвидший спосіб оновити атрибут у всіх продуктах


14

Я намагаюся оновити ціну на багато продуктів (більше 10 000). Те, що я роблю зараз, надзвичайно трудомісткий. Який найкращий спосіб переглянути всі продукти та оновити більшість із них?

Спасибі


Відповіді:


22

Привіт Magento надайте атрибут за кодом нижче

$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();і Mage::getSingleton('catalog/product_action')->updateAttributes(). Середній показник product_api зайняв 1,7 секунди, а запуск продукту - 1,0 секунди. однак, $product->getResource()->saveAttribute()тривав середній 0,04 секунди на сер. Спасибі!
Джошуа Пак

Чи є щось подібне до цього методу, що може оновлювати атрибути на певному рівні магазину?
Роббі Аверилл

Thx @Amit Bera - залишилось 1 питання;) Чи існує також спосіб збереження декількох атрибутів за один раз? Варто було б обернутися навколо $product->getResource()->saveAttributeдії. ДЯКУЮ!!
snh_nl

@amit bera, будь ласка, погляньте на цей magento.stackexchange.com/questions/201757/… що мені робити ??
абхишек

@amit: Мені потрібно, як я можу масово змінити веб-сайт (оновити атрибут у кількох магазинах)
zus

18

Напишіть SQL-запит.

Другий найкращий спосіб (і той, який я рекомендую): \Mage_Catalog_Model_Resource_Product_Action::updateAttributes

Приклад коду від 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($allPro‌​ductIds, $attrData, $storeId);
// reindex:
Mage::getModel('catalog/product_action')->updateAttributes($allPro‌​ductIds, $attrData, $storeId);

Як би це працювало з величинами мультиселектора? Чи додає це значення чи замінює інші попередньо вибрані значення

Мультиселекції зазвичай зберігаються як цілі числа, відокремлені комами, як 27,42,4711. Тому, якщо ви зміните значення на вимову 1, інші значення втрачаються. Але те, що ти можеш зробити, - щось на зразок CONCAT(value, ',1')означає додати нове значення до кінця, відокремлене комою. Я думаю, що навіть якщо ви додасте значення в два рази, це не проблема, тому що Magento фільтрує його наступного разу, коли елемент буде збережено та ігнорує друге значення.


Це буде оновлювати тільки 1k рядки у той час, не так швидко: github.com/OpenMage/magento-mirror/blob/magento-1.9/app/code / ...
B00MER

Коли я правильно розумію код, він пише кожні 1000 рядків, але він оновлює всі підряд.
Фабіан Блешшмідт

1
Дякую @FabianBlechschmidt! Ось мій приклад коду ( суть ):<?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);
Макс Урода

1
Проблема такого підходу полягає в тому, що він не перенастроює продукти, тому ви можете не бачити змін у фронтальному просторі та просто бачити їх на панелі адміністратора. Щоб також повторно встановити функцію після оновлення, ви можете змінитись Mage::getSingleton('catalog/resource_product_action')на Mage::getModel('catalog/product_action')такі самі параметри, які були згадані вище.
шампунь

1
@snh_nl оновив відповідь. Сподіваюся, що це відповість на ваше запитання
Fabian Blechschmidt

5

10k продуктів, використовуйте SQL. EAV просто каламутить води. За запитання - найшвидший спосіб.

Знайти attribute_id

SELECT * FROM eav_attribute where entity_type_id = 4 and attribute_code = 'YOUR_ATTRIBUTE_CODE_HERE'

Оновити знайдений attribute_idзверху запит.

UPDATE catalog_product_entity_int SET value = 1 WHERE attribute_id = FOUND_ATTRIBUTE_ID

Я вважаю, що ви можете зробити підбір з оновленням, але для простоти зрозуміти два запити SQL найпростіше.

ПРИМІТКА: entity_type_id = 4 це найчастіше записи EAV про продукт. У випадку, якщо вам потрібно буде масово оновити категорію або атрибути клієнта, це буде відрізнятися, а також таблиця, яка оновлюється залежно від типу атрибуту, це ваше оновлення. Крім того, якщо у вас є налаштування кількох магазинів, будьте впевнені та зверніть увагу та станstore_id


2

Надалі вище відповіді Фабіана, ви можете оновлювати кілька полів одночасно. Наведений нижче приклад містить всього 2 (на складі, стан запасів), але ви можете використовувати скільки завгодно.

    $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);

Так це якщо ви хочете оновити всі продукти до того самого значення атрибута - як ви могли пристосувати це до оновлення, скажімо, 3 продуктів, все того ж атрибута, але з різними значеннями для атрибута? thx
snh_nl

Дивіться відповідь Аміта Бера вище: magento.stackexchange.com/a/43924/3433
Silas Palmer
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.