【问题标题】:Why does Magento automatically consider a cart abandoned after simply adding an item to it?为什么 Magento 在简单地将商品添加到购物车后会自动考虑放弃?
【发布时间】:2014-03-17 11:08:17
【问题描述】:

一点背景

一位客户正在使用 Bronto 向在 Magento 中放弃购物车的网站访问者发送电子邮件。 Bronto 从 Magento 的报告中取出废弃的手推车。客户遇到的问题是,他注意到在 Magento 中作为订单下的购物车没有从废弃的购物车报告中删除,导致他不小心将有关废弃购物车的电子邮件发送给已经下订单的客户.

我做了什么

我看了看,试图找出发生这种情况的一个主要原因,但我找不到任何原因。我尝试自己做一个测试订单,并注意到一旦我将一件商品添加到购物车中,我的购物车就会被视为废弃的购物车。我想自己“很奇怪,如果我的会话到期并且我还没有签出,这应该认为它被放弃了。”我做了一些研究,看看是否有人有同样的问题,但没有运气,虽然很接近。我采取的下一步是打开持久购物车。我打开了持久性,但这并没有帮助,因为我的购物车仍然被发送到废弃的购物车报告。即使在我结账后,购物车仍保留在报告中。然后我创建了一个观察 sales_order_place_after 事件的模块。该模块在下订单后检查订单并停用创建订单的报价(用户登录时“废弃的购物车”)。取消激活报价会从废弃的购物车报告中删除购物车。这工作正常,但一些报价似乎从裂缝中溜走,并没有设置为非活动状态,不知道为什么。

我的问题

1. 为什么 Magento 会在您向购物车添加商品后自动将其视为已放弃?

2. 我可以在哪里以及如何更改?

3. 为什么持久购物车不按它说的做? (除非持久会话过期或者我只是不了解持久购物车功能,否则不要将购物车发送到废弃的购物车,请解释)

4. 是什么原因导致我的模块没有将某些引号设置为非活动状态?(我在下面显示了代码。config.xml 和 Observer.php)

5. 我是否使用了正确的事件?

config.xml

<config> 
    <modules>
        <RIS_AbandonedCartCleanUp>
            <version>0.0.1</version>
        </RIS_AbandonedCartCleanUp>
    </modules>

    <global>

      <!-- Define the Model -->
      <models>
        <abandonedcartcleanup>
          <class>RIS_AbandonedCartCleanUp_Model</class>
        </abandonedcartcleanup>
      </models>

      <events>
        <sales_order_place_after>
          <observers>
            <abandonedcartcleanup>
              <type>singleton</type>
              <class>RIS_AbandonedCartCleanUp_Model_Observer</class>
              <method>remove_order_quote</method>
            </abandonedcartcleanup>
          </observers>
        </sales_order_place_after>
      </events>

    </global>

</config>

Observer.php

 <?php 

    class RIS_AbandonedCartCleanUp_Model_Observer{

    public function __construct(){
    }

    //Keep an eye out for when all the sales order saves have been committed
    public function remove_order_quote($observer){

        // Gets the order which is being saved.
        $order  = $observer->getOrder();
        $quoteId = $order->getQuoteId(); 

            //Get the quote for this specific order
        $quote = Mage::getModel('sales/quote')->load($quoteId);

            //Check if the quote is active
        if($quote->getIsActive() == 1){

              //set the quote to inactive and save
          $quote->setIsActive('0')
              ->save();
        }
    } 
    }

?>

【问题讨论】:

  • 杰瑞,已经有一段时间了,但你能解决这个问题吗?我面临与 Bronto 相同的问题。
  • 嘿 iUseMagentoNow,不,我没有解决此问题,但 Pixelkracht 确实提供了一些可用于解决问题的有用信息。我肯定会尝试使用 vanilla Magento(无扩展,全新安装),然后对其进行测试,看看是否存在问题。回来报告,让我知道我对你的发现感兴趣并愿意在需要时提供帮助。

标签: php magento


【解决方案1】:

我不能完全回答这个问题,但我会尽力而为。首先,你说:

即使在我结帐后,购物车仍然在报告中。

如果您对此非常确定,则说明发生了一些我无法解释的事情,以下几点可能没有实际意义。

问题 1

如果你在app\code\core\Mage\Reports\Model\Resource\Quote找到Collection.php并复制到app\code\local\Mage\Reports\Model\Resource\Quote并添加

var_dump((string)$this->getSelect());

在 prepareForAbandonedReport 函数中(就在它返回之前),您将看到 Magento 用于生成 Abandoned carts 报告的查询。就我而言,它是:

SELECT `main_table`.*, (main_table.base_subtotal_with_discount*main_table.base_to_global_rate) AS `subtotal`, `cust_email`.`email`, `cust_fname`.`value` AS `firstname`, `cust_lname`.`value` AS `lastname`, CONCAT_WS(' ', cust_fname.value, cust_lname.value) AS `customer_name` 
    FROM `sales_flat_quote` AS `main_table` 
    INNER JOIN `customer_entity` AS `cust_email` ON cust_email.entity_id = main_table.customer_id 
    INNER JOIN `customer_entity_varchar` AS `cust_fname` ON cust_fname.entity_id = main_table.customer_id AND cust_fname.attribute_id = 5 
    INNER JOIN `customer_entity_varchar` AS `cust_lname` ON cust_lname.entity_id = main_table.customer_id AND cust_lname.attribute_id = 7 
    WHERE (items_count != '0') AND (main_table.is_active = '1')

如您所见,它不检查任何日期或时间值。如果购物车中有东西并且它是活动的,即它还没有被签出,它只是认为它被遗弃了。 (另外,有趣的是,它不会费心寻找未登录用户的废弃购物车。)

换句话说,购物车在结账前被视为已废弃。即使已完成订单,仍收到电子邮件的客户可能在结账前就已“排队”接收 Bronto 的电子邮件。

问题 2

您可以通过在“updated_at 是在会话到期时间之前”的效果添加一些条件来修改上述查询,但这可能只会更改报告而不是 Bronto 所做的,因为 Bronto 可能使用自己的查询。他们声称可以发现访客用户遗弃的购物车这一事实似乎表明了这一点。

问题 3

http://www.magentocommerce.com/knowledge-base/entry/setting-up-a-persistent-shopping-cart,上面写着:

持久性购物车会跟踪留在购物车中的未购买物品 购物车,并保存信息以供客户下次访问。

我认为这就是它所做的一切。持久购物车仅在用户返回时保存。这本身与他们处于被遗弃状态并不矛盾。

问题 4 和 5

据我所知,您的代码看起来不错。但实际上没有必要将报价设置为非活动状态。 Magento 应该默认处理这个问题,如果没有,就像我一开始说的那样,你有一些事情我无法立即解释

+1 表示您在表述问题时所采取的谨慎态度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    • 2020-01-14
    • 2012-11-03
    相关资源
    最近更新 更多