【问题标题】:How to remove assignment of products in a category in Magento?如何在 Magento 中删除类别中的产品分配?
【发布时间】:2012-09-26 09:08:51
【问题描述】:

我正在遍历 Magento 中的产品列表。我确实使用setCategoryIds() 分配了新的类别ID,但不会删除旧的分配。 就像产品 A 在类别 X 中一样。现在我希望 A 在类别 Y 和 Z 中并且不在 X 中。我执行 setCategoryIds(Y,Z),现在产品在 X、Y 和 Z 中。

如何在不使用 SOAP API 的情况下以编程方式删除它?

【问题讨论】:

    标签: php magento assign


    【解决方案1】:

    实际上,setCategoryIds 应该重置所有以前的类别,如果它们不在设置的类别中。我创建了一个测试 shell 脚本 test.php 来测试它:

    <?php
    require_once 'abstract.php';
    
    /**
     * Magento Test Assignment Script
     *
     * @category    Mage
     * @package     Mage_Shell
     */
    class Mage_Shell_Test extends Mage_Shell_Abstract
    {
        /**
         * Run script
         *
         */
        public function run()
        {
            $productId = $this->getArg('product');
            $catIdsString = $this->getArg('categories');
            $catIds = explode(',', $catIdsString);
            /** @var $product Mage_Catalog_Model_Product */
            $product = Mage::getModel('catalog/product')->load($productId);
            $product->setCategoryIds($catIds);
            $product->save();
            print_r($product->getCategoryIds());
        }
    
        /**
         * Retrieve Usage Help Message
         *
         */
        public function usageHelp()
        {
            return <<<USAGE
    Usage:  php -f test.php -- [options]
            php -f test.php -- --product 1 --categories 3,4
    
      --product <product>       Product Id
      --categories <categories> Categories to assign, comma separated
      help                      This help
    
    USAGE;
        }
    }
    
    $shell = new Mage_Shell_Test();
    $shell->run();
    

    您可以将其插入您的shell 文件夹并尝试运行关联。

    【讨论】:

    • 好的,尝试使用属于 14,15 和 18 类别的产品。将其设置为 15 和 20,结果是 14,15,18 和 20...我真的不知道不明白...
    • 您的代码出了点问题...尝试关闭所有自定义模块并查看问题是否仍然存在。此外,查看错误日志也很有用,可能在产品保存过程中出现问题
    • Mage::getSingleton('catalog/category_api')-&gt;assignProduct($category-&gt;getId(),$product-&gt;getId()) 是我之前使用的,它只是添加到类别中。 $product-&gt;setCategoryIds($catIds) 帮助清理了类别,只设置我说要设置的内容,并清除任何其他类别。
    • 我还想补充一点,通过getSingleton,您可以通过Mage::getSingleton('catalog/category_api')-&gt;removeProduct($category-&gt;getId(),$product-&gt;getId());从类别中删除产品
    【解决方案2】:

    试试这个:

    $proxy = new SoapClient('http://magentohost/api/soap/?wsdl');
    $sessionId = $proxy->login('apiUser', 'apiKey');
    
    $categoryId = 5; // Put here your category id
    $storeId = 1; // You can add store level
    
    $assignedProducts = $proxy->call($sessionId, 'category.assignedProducts', array($categoryId, $storeId));
    var_dump($assignedProducts); // Will output assigned products.
    
    // Assign product
    $proxy->call($sessionId, 'category.assignProduct', array($categoryId, 'someProductSku', 5));
    
    // Update product assignment postion
    $proxy->call($sessionId, 'category.updateProduct', array($categoryId, 'someProductSku', 25));
    
    // Remove product assignment
    $proxy->call($sessionId, 'category.removeProduct', array($categoryId, 'someProductSku'));
    

    点击此链接:See Here

    【讨论】:

    • 我应该提到这一点。客户不允许使用 SOAP API。一定有办法没有那个...
    猜你喜欢
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-24
    相关资源
    最近更新 更多