批量更新产品以包括新网站


16

一个客户拥有20000多种产品和7个网站。他们曾经有4个网站,大多数产品都与4个网站相关联。迭代产品并更新产品以包括新网站的最佳和最快方法是什么。

我有以下代码,但是它太慢了:

$ productCollection =法师:: getModel('目录/产品')-> getCollection()
    -> addFieldToFilter('sku',array('like'=> '02%'));
foreach($ productCollection作为$ product){
    echo $ product-> getSku();
    $ product-> setWebsiteIds(array(1,2,3,4,5,6,7));
    尝试{
        $ product-> save();
        回显“-已保存”。
    } catch(Exception $ e){
        echo'-'。$ e-> getMessage();
    }
    回显“ \ n”;
}

我当时在考虑使用迭代器遍历方法,但是我知道商店/网站并非完全是一个属性,因此无法轻松地对其进行单独更新。

Answers:


36

步骤1
使用新的网站ID构建一个数组。

$websiteIds = array(5,6,7);

步骤2
现在获取所有产品ID。

$productIds= Mage::getResourceModel('catalog/product_collection')->getAllIds();

步骤3
将所有产品分配到新网站:

Mage::getModel('catalog/product_website')->addProducts($websiteIds, $productIds);

步骤4
自我感觉良好。


1
谢谢马吕斯。完美的答案。(我会投票,但我不能投票)
2014年

3
步骤5创建要点:gist.github.com/mauricioprado00/2b730532689d28dcdb2b。您可以执行“ php -f shell / product-website.php---products all --websites all”或指定网站/产品ID。
2015年

哇...这是一个非常完美的高效解决方案。甚至我也要遍历所有这些产品来更新它们。我想知道如何学习有关Magento的概念。
Deepanshu Goyal

在典型的Marius时尚中,魅力十足!
备用轮胎

1
这些产品似乎没有出现在固定目录中,并且在前端不可见。使用-save()方法时,产品确实会出现。有谁知道为什么马吕斯的方法会带来这个问题?M1.9,4个网站,15k产品,平面目录
Tom

3

如果您只想添加分配给所有四个先前存在的网站的产品,请使用以下方法:

$oldWebsiteIds = [2, 3, 4, 5];
$newWebsiteIds = [6, 7, 8]

/** @var Mage_Catalog_Model_Resource_Product_Collection $productCollection */
$productCollection = Mage::getResourceModel('catalog/product_collection');
$productCollection->addWebsiteFilter($oldWebsiteIds );
// only filter products present in ALL of the websites
$productCollection->getSelect()
    ->having('COUNT(website_id) = ?', count($oldWebsiteIds))
    ->distinct(false)
    ->group('e.entity_id');
$productIds = $productCollection->getAllIds();

Mage::getModel('catalog/product_website')->addProducts($newWebsiteIds, $productIds);

另请参阅: 使用AND按网站过滤产品

这可以是Magento设置脚本或一次性PHP脚本(在这种情况下include 'app/Mage.php';,请在顶部添加并在使用后将其从服务器中删除)


1

第1步:获取所有网站ID /制作网站ID数组

$websiteIds = Mage::getResourceModel('core/website_collection')->getAllIds();

第2步:获取所有产品ID

$productIds= Mage::getResourceModel('catalog/product_collection')->getAllIds();

步骤3:将网站ID添加到所有产品

$actionModel = Mage::getSingleton('catalog/product_action');
$actionModel->updateWebsites($productIds, $websiteIds, 'add');

注意:如果要从产品中删除网站。使用删除而不是添加单词

$actionModel->updateWebsites($productIds, $websiteIds, 'remove');

0

如果您的懒惰到了不想创建任何PHP文件的地步,那么另一个解决方案是:

INSERT IGNORE INTO catalog_product_website
SELECT entity_id, {website_id} FROM catalog_product_entity

为我工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.