将产品价格设置为等于所有简单产品的特价

Set product price to be equal to the special price for all simple products

我知道这是一个特定于框架的问题,而不是一个真正的通用编程问题,但我已经在 Magento StackExchange forums 上问过这个问题,但没有得到回复。

我想将我所有简单产品的正常价格替换为特价(特价将不再存在)。我是 Magento 的新手,我不知道最好的方法是什么。

我正在考虑一个 SQL 替换值的查询,然后找到一种方法来禁用不再打折的产品的特价。

我也在想我可以使用 Import/Export 工具导出一个包含所有打折简单产品的列表,在 Excel 中更改它们的属性,然后用 Magmi 导入新的 csv,但是默认的 Magento Import/Export 工具对我来说效果不佳(同一 SKU 的多行)。

有什么方法可以安全地做到这一点吗? Magmi 是否可以禁用我产品的所有特价?

我的 Magento 版本是 Magento 1.9

谢谢!

我个人的偏好是使用 Magento shell 脚本。您可以在 shell 目录下找到一些示例。

一旦你创建了一个,你可以简单地调用它:

php shell/<script-name>.php

这样,您就可以访问 Magento 的 ORM,并且可以以更安全的方式完成此操作。

实现这样的 cli 脚本应该很容易,但如果您需要帮助,这里是未经测试的版本::)

<?php

require_once 'abstract.php';

class Mage_Shell_SpecialPrice extends Mage_Shell_Abstract
{
    public function run()
    {
        if ($this->getArg('help')) {
            echo $this->usageHelp();
            return;
        }

        $collection = $this->_getProductCollection();

        /** @var Mage_Catalog_Model_Product $product */
        foreach ($collection as $product) {
            $product->setPrice($product->getSpecialPrice())
                ->setSpecialPrice(null);

            $product->getResource()->saveAttribute($product, 'price');
            $product->getResource()->saveAttribute($product, 'special_price');
        }
    }

    /**
     * @return Mage_Catalog_Model_Resource_Product_Collection
     */
    protected function _getProductCollection()
    {
        return Mage::getResourceModel('catalog/product_collection')
            ->addAttributeToFilter('special_price', array('notnull' => true))
            ->setOrder($this->getArg('limit') ?: 'created_at', $this->getArg('dir') ?: 'desc')
            ->setPageSize($this->getArg('limit') ?: 20);
    }

    /**
     * @return string
     */
    public function usageHelp()
    {
        return <<<USAGE
Usage:  php -f special-price.php
        php -f special-price.php --limit 20 --sort created_at --dir desc
USAGE;
    }
}

$shell = new Mage_Shell_SpecialPrice();
$shell->run();

我加入了一些命令行参数示例作为衡量标准,但通常就是这样。

干杯。 :)