我正在调查客户订单(正常方式)和商店订单(WooCommerce ->订单→添加订单(顶部的蓝色按钮),由商店管理员为客户创建:
1)。客户订单:顾客把东西放入购物车,想用PayPal付款,并在PayPal屏幕上决定取消订单,点击链接并返回商店。订单还在,商品还在购物车里。
2)。车间定单:管理员创建订单,添加产品并完成订单。客户收到带有付款链接的邮件,这将带他到订单。想用PayPal付款,在PayPal屏幕上改变主意,点击"取消订单并返回商店",与1相同。订单将被取消,所有产品将逐一从购物车中删除。
我希望我能避免这种情况,把产品留在购物车里…但我不知道从哪里开始。
创建商店订单的链接是:wp-admin/post-new.php?Post_type =shop_order,这给我的建议大概是这样的:
if ($post_type=="shop_order" && $action=="cancel_order") {
clear_cart();
cancel_order();
}
并注释掉。这个代码会在哪里呢?有人能给我指个正确的方向吗?
对于客户订单,它是有效的,因为付款实际上从未完成,因此购物车从未清空,并且购物车中的商品仍然存在。
对于管理订单,一开始没有客户购物车,因此客户最终会得到一个空的购物车(或处于原始状态的购物车)。
您可以通过将所有订单项目添加回购物车来绕过此问题,例如使用woocommerce_cancelled_order
动作,该动作在订单取消后立即被触发。
add_action( 'woocommerce_cancelled_order', 'recover_cart_for_cancelled_orders', 20, 1 );
function recover_cart_for_cancelled_orders( $order_id ) {
$order = wc_get_order($order_id);
if( $order ) {
// Empty the cart first
WC()->cart->empty_cart();
// Add each item from cancelled order back to cart
$order_items = $order->get_items();
foreach ($order_items as $order_item) {
$product_id = $order_item->get_product_id();
WC()->cart->add_to_cart($product_id, $order_item->get_quantity());
}
}
}
注意请记住,这可能会导致一些客户不想要的结果和糟糕的用户体验。例如,如果客户创建了一个订单(尚未付款),然后决定启动一个新的购物车,然后取消了原始的未付款订单,那么他将失去当前的购物车,而最终得到的将是原始订单中的购物车内容。
为了避免这种情况,也许您可以将recover_cart_for_specified_orders
函数中的代码包装为一个条件,并且仅在购物车为空时清空/恢复购物车:
if( WC()->cart->get_cart_contents_count() == 0 ) {}