WooCommerce:阻止用户删除购物车项目

时间:2019-09-27 作者:USD Matt

我的任务是创建客户可能想到的最尴尬的购买流程。

在购买产品时,客户会进入一个多步骤的过程,在这个过程中,他们会构建一个定制的“包装”(为了使事情更加复杂,包装的某些部分是根据过程中早些时候做出的选择定价的)。现在,因为他们希望客户能够调整原始产品的数量,所以我能在篮子中想出的唯一解决方案是将原始产品显示为正常,然后有第二个“包装”产品,其中列出他们选择的其他零件以及这些选择的总价格作为商品成本。这不是什么大问题,希望阻止他们更改包装数量也不会太复杂。

现在,当他们删除产品时,软件包也应该删除。我还没有解决这个问题,但我怀疑我可以向购物车项目添加一些元数据来链接它们,然后在item_removed 处理程序。(基本上我会给这个项目一个独特的package_id 在元数据中,然后删除篮子中引用该id的任何其他内容)

我的问题是阻止他们删除包。理想情况下,我只想显示一个错误,该错误链接到主产品,如果他们不想要,则需要删除该错误。

到目前为止,我已经尝试了以下两种选择,但都不能正常工作-

使用woocommerce_remove_cart_item 并引发异常。这将停止删除项目,但异常消息不会显示为通知,并将调用添加到wc_add_notice 什么都不做(我想是因为我抛出了一个异常,但是这里除了异常之外的任何东西都将返回到cart->remove_cart_item() 功能,项目将正常删除。)woocommerce_cart_item_removed 并将物品放回原处。这似乎是可行的,尽管只是为了放回去而删除项目有点混乱。问题是,即使出现我的错误通知并且项目恢复原样,它仍会显示“项目已删除”成功消息是否有一种简单的方法可以阻止项目被删除?我确信其他Woocommerce特性/插件为依赖项提供了类似的功能,但我只能在代码中看到前/后挂钩。看来实际unset 无论呼叫如何运行。

1 个回复
SO网友:USD Matt

也许有一种方法可以做到这一点,但简单地浏览相关函数表明,我基本上无法控制要删除的项目,或者调用wc_add_notice 标记为已删除。

因此,我最终采用了以下相当简单但略显丑陋的方法:

add_action(\'woocommerce_cart_item_removed\', function($key, $cart){

    // SNIP - My logic to decide if this item can\'t be removed by itself

    $cart->restore_cart_item($key);

    wc_add_notice(\'This package is tied to another product in your basket.\', \'error\');
    add_filter(\'woocommerce_add_success\', \'__return_false\');

}, 5, 2);
基本上,我恢复了该项目,并添加了一个错误通知,通知用户我们无法删除它。然后,对于当前请求的其余部分,我过滤任何新的成功通知,以将文本替换为FALSE.

用于显示通知的代码使用array_filter 排除列表中等同于false的任何元素,以便在添加消息时,不会显示任何文本。

移除篮子项目后,代码路径将从WC_Form_Handler 只需添加“已删除”通知并执行wp_safe_redirect, 因此,就我所知,在这一点上,压倒一切的通知不应该有任何其他不利影响。