tl; dr:似乎没有其他开箱即用机制可以删除从未转换为订单的报价记录。
Mage_Sales
模块具有用于清除过期引号的预定作业,但这仅删除标记为非活动的sales_flat_quote
条记录(即is_active = 0
)。据我所知,报价仅在报价转换为订单时标记为非活动。如果是这种情况,那么报价表只会越来越大。
参考Mage_Sales_Model_Observer::cleanExpiredQuotes()
class Mage_Sales_Model_Observer
{
//...
public function cleanExpiredQuotes($schedule)
{
Mage::dispatchEvent('clear_expired_quotes_before', array('sales_observer' => $this));
$lifetimes = Mage::getConfig()->getStoresConfigByPath('checkout/cart/delete_quote_after');
foreach ($lifetimes as $storeId=>$lifetime) {
$lifetime *= 86400;
/** @var $quotes Mage_Sales_Model_Mysql4_Quote_Collection */
$quotes = Mage::getModel('sales/quote')->getCollection();
$quotes->addFieldToFilter('store_id', $storeId);
$quotes->addFieldToFilter('updated_at', array('to'=>date("Y-m-d", time()-$lifetime)));
$quotes->addFieldToFilter('is_active', 0);
foreach ($this->getExpireQuotesAdditionalFilterFields() as $field => $condition) {
$quotes->addFieldToFilter($field, $condition);
}
$quotes->walk('delete');
}
return $this;
}
//...
}
答案 0 :(得分:8)
使用您自己的清理例程覆盖观察者。我们在特定时间段保留特定报价,因此删除4层。访客购物车可以获得重新邮件并且可以恢复,空的注册客户报价在已完成的报价旁边过期,注册的购物车内容会根据观察到的客户行为长时间保存。
<?php
/**
* Magento
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/osl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@magentocommerce.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade Magento to newer
* versions in the future. If you wish to customize Magento for your
* needs please refer to http://www.magentocommerce.com for more information.
*
* @category Mage
* @package Mage_Sales
* @copyright Copyright (c) 2010 Magento Inc. (http://www.magentocommerce.com)
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
*/
/**
* Sales observer
*
* @category Chief
* @package Chief_Sales
* @author Magento Core Team <core@magentocommerce.com>
*/
/* Valid for 1.4.2.0, 1.5.1.0 */
class Chief_Sales_Model_Observer extends Mage_Sales_Model_Observer
{
/**
* Clean expired quotes (cron process)
*
* @param Mage_Cron_Model_Schedule $schedule
* @return Mage_Sales_Model_Observer
*/
public function cleanExpiredQuotes($schedule)
{
$lifetimes = Mage::getConfig()->getStoresConfigByPath('checkout/cart/delete_quote_after');
/* Quotes converted to orders */
foreach ($lifetimes as $storeId=>$lifetime) {
$lifetime *= 86400;
$quotes = Mage::getModel('sales/quote')->getCollection();
/* @var $quotes Mage_Sales_Model_Mysql4_Quote_Collection */
$quotes->addFieldToFilter('store_id', $storeId);
$quotes->addFieldToFilter('updated_at', array('to'=>date("Y-m-d", time()-$lifetime)));
$quotes->addFieldToFilter('is_active', 0); // Filled Quotes
$quotes->walk('delete');
}
/* Quotes abandoned by Guest Carts */
foreach ($lifetimes as $storeId=>$lifetime) {
$lifetime *= 86400;
// triple lifetime for abandoned cart remail
$lifetime *= 3;
$quotes = Mage::getModel('sales/quote')->getCollection();
/* @var $quotes Mage_Sales_Model_Mysql4_Quote_Collection */
$quotes->addFieldToFilter('store_id', $storeId);
$quotes->addFieldToFilter('updated_at', array('to'=>date("Y-m-d", time()-$lifetime)));
$quotes->addFieldToFilter('is_active', 1); // Active Quotes
$quotes->addFieldToFilter('customer_group_id', 0); // Which are Group NLI (Guest)
$quotes->walk('delete');
}
/* Quotes abandoned by Registered carts no contents */
foreach ($lifetimes as $storeId=>$lifetime) {
$lifetime *= 86400;
$quotes = Mage::getModel('sales/quote')->getCollection();
/* @var $quotes Mage_Sales_Model_Mysql4_Quote_Collection */
$quotes->addFieldToFilter('store_id', $storeId);
$quotes->addFieldToFilter('updated_at', array('to'=>date("Y-m-d", time()-$lifetime)));
$quotes->addFieldToFilter('is_active', 1); // Active Quotes
$quotes->addFieldToFilter('customer_group_id', array('gt'=>0)); // For all other groups
$quotes->addFieldToFilter('items_qty', 0); // For empty carts
$quotes->walk('delete');
}
/* Quotes abandoned by Registered carts */
foreach ($lifetimes as $storeId=>$lifetime) {
$lifetime *= 86400;
// Registered cart lifetime for abandoned cart remail 7*25 = 175 days
$lifetime *= 25;
$quotes = Mage::getModel('sales/quote')->getCollection();
/* @var $quotes Mage_Sales_Model_Mysql4_Quote_Collection */
$quotes->addFieldToFilter('store_id', $storeId);
$quotes->addFieldToFilter('updated_at', array('to'=>date("Y-m-d", time()-$lifetime)));
$quotes->addFieldToFilter('is_active', 1); // Active Quotes
$quotes->addFieldToFilter('customer_group_id', array('gt'=>0)); // For all other groups
$quotes->addFieldToFilter('items_qty', array('gt'=>0)); // For expired carts
$quotes->walk('delete');
}
return $this;
}
}