【问题标题】:Get the order ID in checkout page before payment process在付款过程之前在结帐页面中获取订单 ID
【发布时间】:2017-04-10 06:55:04
【问题描述】:

在 WooCommerce 中,我需要 order ID 直接在 WooCoommerce 的结帐页面,付款前,创建订单时。

我查看了所有会话,并试图找出订单何时在 order_awaiting_payment 会话中付款,但在付款之前我需要它。
所以我想到了一个解决方案,即在结帐页面加载时下订单(实际上是让它准备好付款),并在结帐真正完成时更新它。

在 WooCommerce 中订单付款之前如何在结帐页面获取订单 ID?

我认为这有一些钩子,但我找不到。

【问题讨论】:

    标签: php wordpress woocommerce checkout hook-woocommerce


    【解决方案1】:

    您可以使用在woocommerce_checkout_order_processed 操作挂钩中挂钩的自定义函数。
    由于woocommerce 3.0+版本,这里是对应的核心代码位于process_checkout()函数中。

    // Since WooCommerce version 3.0+
    do_action( 'woocommerce_checkout_order_processed', $order_id, $posted_data, $order );
    

    WooCommerce 3.0 及以下版本:

    // Since WooCommerce version 2.1+ (before version 3.0+)
    do_action( 'woocommerce_checkout_order_processed', $order_id, $this->posted );
    

    因此,根据您使用的 woocommerce 版本,有两种情况:

    从 WooCommerce 3.0+ 开始,您可以在挂钩函数中使用 2 个额外的参数并且您不需要在获得 时创建订单对象的实例 $order 已作为参数。
    您还可以通过 $posted_data 参数直接访问发布的数据。

    add_action('woocommerce_checkout_order_processed', 'action_checkout_order_processed', 10, 3);
    function action_checkout_order_processed( $order_id, $posted_data, $order ) {
       // Do something
    }
    

    由于 WooCommerce 2.1+ (在 WooCommerce 3.0 之前),您只有 $order_id 作为参数,因此您可能需要使用 wc_get_order() 函数获取 $order 对象的实例:

    add_action('woocommerce_checkout_order_processed', 'action_checkout_order_processed', 10, 1);
    function action_checkout_order_processed( $order_id ) {
       // get an instance of the order object
       $order = wc_get_order( $order_id );
    
       // Do something
    }
    

    代码位于您的活动子主题(或主题)的 function.php 文件中或任何插件文件中。

    【讨论】:

      【解决方案2】:

      很遗憾,您无法访问结帐页面本身的 order_id,因为尚未创建订单。虽然这是真的,但购物车数据会暂时保存为 WooCommerce 所称的“会话”。如果您可以稍微调整一下,这可能会帮助您解决将信息传递给 iFrame 的问题。

      您可以通过从 WC_session 获取信息来做到这一点:

      $cart_data = WC()->session->get('cart');
      

      完成此操作后,您将能够使用诸如“product_id”之类的键索引来访问 WooCommerce 存储的购物车数据层次结构:

      $cart_data[array_keys($cart_data)[0]]['product_id'];
      

      以下是有效的购物车数据键列表:


      产品编号
      变体ID
      变化(数组)
      数量
      数据哈希
      line_tax_data(数组)
      行小计
      line_subtotal_tax
      line_total
      line_tax

      【讨论】:

        【解决方案3】:

        如果您只查看第 935 行的 class-wc-checkout.php 文件,您会看到有一个动作 woocommerce_checkout_order_processed$order_id 作为参数传递。

        所以这应该适合你:

        add_action('woocommerce_checkout_order_processed', 'wh_pre_paymentcall');
        
        function wh_pre_paymentcall($order_id) {
        
            //create an order instance
            $order = wc_get_order($order_id);
            //$payment_method = $order->payment_method_title;
            //$status = $order->get_status();
        
            // write your custom logic over here.
        }
        

        代码进入您的活动子主题(或主题)的functions.php 文件中。或者也可以在任何插件 php 文件中。

        相关问题:WooCommerce Get Order Product Details Before Payment in Plugin(另请阅读 cmets)

        希望这会有所帮助!

        【讨论】:

        • 感谢您的出色回应,但实际上我需要将 order_id 传递给结帐页面中的 iframe,因此我需要在结帐页面加载时访问它。我认为这个钩子在付款之前会执行操作,并且当我想要这个钩子时无法访问 order_id
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-10
        • 2019-06-17
        • 2013-12-06
        • 2017-08-19
        • 2011-07-18
        相关资源
        最近更新 更多