首页 文章

在Woocomerce结账期间,请保持同一页面并且不要清空购物车会话

提问于
浏览
1

我正在创建一个额外的插件,这是一个使用Woocommerce插件和子主题来定制它的自定义支付网关 .

这是有效的,我看到付款表格正确,物品很好 . 我遇到的问题是付款流程选项 .

结帐页面具有支付解决方案的i帧,并且应该仅在创建订单并且存在ID时显示 . 并确保我们拥有所有人员的详细信息等 .

但是,流程付款会将您带到感谢您的页面 . 它还会转储购物车会话 .

即使我通过玩弄它将URL重定向回购物车页面,它仍然会杀死购物车 .

这在正常情况下会很好,因为我希望它能够进入付款页面,结账并完成 . 但是我不想这样做,因为这个站点必须镜像一个当前正在运行的站点以及它是如何工作的 .

我的扩展类中的函数是这样的 .

public function process_payment( $order_id ) {

        global $woocommerce;

        #$order = wc_create_order();
        ///
        $order = new WC_Order( $order_id ); 

        // Mark as on-hold (we're awaiting the cheque)
        $order->update_status('on-hold', __( 'Awaiting Confirmation of Funds', 'woocommerce' ));

        // Reduce stock levels
        ///$order->reduce_order_stock();

        // Remove cart
        //$woocommerce->cart->empty_cart();

        // Return thankyou redirect
        return array(
            'refresh' => true,
            'reload' => false,
            'result' => 'success',
            'redirect' => $this->get_return_url( $order )
        );
        ///return $order_id;
    }

正如您所看到的,我注释掉了清空推车的位置以及 endpoints 带来的谢谢模板,而不是只停留在同一页面上 .

到目前为止,我尝试过:

  • 将我的结帐时的代码复制到感谢页面,这会导致未定义的结帐,因为该进程会在此时将其删除

  • 将结束点引用更改为与结帐相同

  • 创建另一个页面并在其上放置相同的短代码

没有任何作用,我已经通过插件,可以看到我能做的一些事情 .

  • 将process_payment函数复制到我的扩展类中并有效地重写它或

  • 找到一个类似于下面的过滤器,可以做我需要的

add_action('woocommerce_thankyou',function(){

global $woocommerce;
$order = new WC_Order();
if ( $order->status != 'failed' ) {
    wp_redirect( home_url() ); exit; // or whatever url you want
}

});

我需要的是它保持在同一页面(刷新),就像它检查细节以刷新总数时一样 . 创建一个订单,其中包含当前的详细信息并返回订单号 . 此时不会杀死购物车会话,所以如果我为了参数而刷新浏览器,它将保持生效 . (当人们离开并且在那时创建了一个独特的会话时,我将找到一种杀死购物车的方法) .

这一点我过去几天一直在与之斗争,并不确定最佳方式 .

任何帮助或指针将不胜感激 .

谢谢

和我

1 回答

  • 1

    好的想出来了 .

    有一个 Headers 动作可以清除购物车 . 我们需要为数组添加更多状态,以便忽略它 .

    首先删除操作,然后添加自己的方法 .

    function st_wc_clear_cart_after_payment( $methods ) {
        global $wp, $woocommerce;
    
        if ( ! empty( $wp->query_vars['order-received'] ) ) {
    
            $order_id = absint( $wp->query_vars['order-received'] );
    
            if ( isset( $_GET['key'] ) )
                $order_key = $_GET['key'];
            else
                $order_key = '';
    
            if ( $order_id > 0 ) {
                $order = wc_get_order( $order_id );
    
                if ( $order->order_key == $order_key ) {
                   WC()->cart->empty_cart();
                }
            }
    
        }
    
        if ( WC()->session->order_awaiting_payment > 0 ) {
    
            $order = wc_get_order( WC()->session->order_awaiting_payment );
    
            if ( $order->id > 0 ) {
                // If the order has not failed, or is not pending, the order must have gone through
                if ( ! $order->has_status( array( 'failed', 'pending','pending-st-cleared-funds','on-hold' ) ) ) { ///// <- add your custom status here....
                    WC()->cart->empty_cart();
                }
             }
        }
    }
    function override_wc_clear_cart_after_payment() {
        remove_filter('get_header', 'wc_clear_cart_after_payment' );
        add_action('get_header', 'st_wc_clear_cart_after_payment' );
    }
    add_action('init', 'override_wc_clear_cart_after_payment');
    

相关问题