Magento 将产品批量分配到类别

Posted

技术标签:

【中文标题】Magento 将产品批量分配到类别【英文标题】:Magento mass-assign products to category 【发布时间】:2012-05-18 09:23:23 【问题描述】:

正如标题所说,我需要将产品批量分配到一个类别,并且从管理员那里我一次只能编辑一个产品;我不知道为什么从类别页面的“类别产品”选项卡中批量添加它们不起作用。 这就是为什么我需要另一种快速的方法,比如使用 phpMyAdmin 或类似的方法。

有什么帮助吗?

提前致谢!

【问题讨论】:

也试试我的扩展:Dynamic Category Products - 它使用简单的定义规则,允许将产品分配到类别。 【参考方案1】:

我设法用以下代码解决了这个问题:

$write = Mage::getSingleton('core/resource')->getConnection('core_write');
$x = 1171;
$y = 2000;
$categoryID = 4;
$productPosition = 0;
while($x <= $y) 
$write->query("REPLACE INTO `catalog_category_product` (`category_id`, `product_id`,  `position`) VALUES ($categoryID, $x++, $productPosition)");

echo "The job is done";
?>

我希望代码对每个人都清楚,如果不是,请回复,我会尝试解释它。

@nachito:在这里。

【讨论】:

您应该尽可能使用模型而不是原始 SQL 来更新 Magento 数据。在save 期间,有许多方法被执行并对数据产生影响。【参考方案2】:

您也可以使用 magento API 执行此操作 这是我用于批量添加产品的脚本。 sku.txt 每行包含一个 sku。

<?php
$wsdlUrl = "magento-root/index.php/api/soap/?wsdl";
$proxy = new SoapClient($wsdlUrl);
$sessionId = $proxy->login('apiuser', 'apipasswd');


$listOfDiscountedSKUFile = "sku.txt";


function readinFile($filePath)

    $fp = fopen($filePath,'r') or exit("Unable to open file!");
    $dataItems = array();
    while(!feof($fp))
    
        $dataItems[] = trim(fgets($fp));
    
    fclose($fp);
    var_dump($dataItems);
    return $dataItems;


function addToCategory($sku,$categoryId)

    global $proxy,$sessionId;
    $proxy->call($sessionId, 'category.assignProduct', array($categoryId, $sku));


function IsNullOrEmptyString($question)
        return (!isset($question) || trim($question)==='');

$categoryId = 82;//e.g.
$listOfSKU = readinFile($listOfDiscountedSKUFile);
foreach($listOfSKU as $sku)

    addToCategory($sku,$category);


?>

【讨论】:

【参考方案3】:

我创建了一个简单的脚本来在 Magento 之外执行此操作。请务必先在单个产品上进行测试,并确保其外观符合您的预期。

// Load Magento
require_once 'path/to/app/Mage.php';
Mage::app();

// $productIds is an array of the products you want to modify.
// Create it however you want, I did it like this...
$productsIds = Mage::getModel('catalog/product')->getCollection()
    ->addAttributeToFilter('sku', array('like' => 'something'))
    ->getAllIds();

// Array of category_ids to add.
$newCategories = array(20);
foreach ($productIds as $id) 
    $product = Mage::getModel('catalog/product')->load($id);
    $product->setCategoryIds(
        array_merge($product->getCategoryIds(), $newCategories)
    );
    $product->save();

如果您希望覆盖产品的现有类别,请将 array_merge(...) 更改为 $newCategories

【讨论】:

当我尝试您的解决方案时,会出现此错误:code 致命错误:未捕获异常 'Mage_Eav_Model_Entity_Attribute_Exception' 并带有消息 'SQLSTATE[23000]:完整性约束违规:1062 重复条目 '1059-1-0- /home/lumeatap/public_html /app/code/core/Mage/Core/Model/Config.php:1350 code 中的密钥 'E8AB433B9ACB00343ABB312AD2FAB087'' 的 10.0000-0' 不知道该说什么...您是否以某种方式在系统中获得了重复的 SKU? 我最终设法将所有产品分配到它们的类别。您的答案很接近,但您提供的代码可能使用“插入”sql 命令而不是“替换”。我做了其他简单的脚本,在其中我编写了直接处理数据库的 sql 查询,并且通过使用“INSERT”而不是“REPLACE”得到了同样的错误。我还通过将“array_merge()”更改为“$newcategories”来尝试您的建议,但没有效果。谢谢! @DanCapitanDePlai 很高兴你解决了这个问题。您可以发布您的答案以便其他人使用吗? 我发表了另一篇包含解决方案的帖子。感谢您提供帮助。【参考方案4】:

我会回避从数据库方面解决这个问题。如果您确实朝着这个方向前进,请确保并进行大量备份,并在低使用率时进行。

following thread on the Magento forum 标识了同样的问题。一张海报通过示例推荐了一种原始 sql 方法。同样,我会小心的 - 确保您进行备份。

我最喜欢线程中的答案(由 Magento MVP 发布):

进入您不希望他们进入的类别,找到产品列表。 单击要删除的产品上的复选框并选择 从小下拉列表中删除。

现在进入您所在的类别 确实想要它们,请转到产品列表。选择 NO 下拉菜单,使其 显示不在类别中的项目。你可能需要做一个选择性的 搜索以限制内容并在几次迭代中完成。点击 复选框并告诉它添加内容。

【讨论】:

@RThomas:关于你最喜欢的答案:我知道这很奇怪,我没有任何提示为什么这不起作用。我有大量未分配的产品,当我尝试从类别页面评估它们时,magento 表现得很奇怪,不想添加它们,有时他甚至减少了该类别中的产品总数。 是的,我做了,但无济于事。做,我终于让它工作了,我已经在这个页面的底部发布了解决方案。 :) 谢谢!

以上是关于Magento 将产品批量分配到类别的主要内容,如果未能解决你的问题,请参考以下文章

产品没有出现在Magento2子类别上

magento 1.9 新添加的产品没有显示在分类页面?

如何在类别产品列表底部的 magento 2.1.8 中移动静态块

Magento:删除产品,301重定向到相关的现有页面,例如,它的父类别

Magento 主题例外不适用于类别和产品页面

Magento API:将预先存在的简单产品分配给可配置产品