【问题标题】:Access the order object from woocommerce_order_details_after_order_table hook从 woocommerce_order_details_after_order_table 挂钩访问订单对象
【发布时间】:2019-09-19 00:17:08
【问题描述】:

在 WooCommerce 中,我正在制作一个自定义商家插件,并添加了这个钩子:

add_action( 'woocommerce_order_details_after_order_table', 'track_me' );

track_me() 函数中,我想检索订单 来做一些事情。

该函数在我想要的时候做我想做的事,但我目前从看起来很笨拙的 URL 获取order_id

我不知道如何正确检索 $order 对象或 $order_id 就足够了。

这几乎可以肯定是显而易见的,因为在 Internet 上搜索数小时都没有结果。我只是不知道明显的东西是什么......

更新 1:按照@LoicTheAztec 的建议,我做了以下事情:

do_action( 'woocommerce_order_details_after_order_table_items', $order );

class Order_MY extends WC_Order
{
    function __construct() 
    {
        add_action( 'woocommerce_order_details_after_order_table', array( $this, 'track_me' ) );
    }

    function track_me( $order ) 
    { 
        // My code here
    }
}

脚本失败的第一个地方是 do_action 行,PHP 抱怨 $order 是一个未定义的变量。

脚本在扩展 WC_Order 时也失败:找不到类 'WC_Order'

新问题...我需要做些什么来确保我可以访问插件中的 woocommerce 类吗?

【问题讨论】:

    标签: php wordpress woocommerce hook-woocommerce orders


    【解决方案1】:

    WC_Order 对象实例 $order 变量包含在挂钩中。
    您在order/order-details.php template file 上看到了这一点(第 76 行)

    do_action( 'woocommerce_order_details_after_order_table_items', $order );
    

    所以你可以这样在你的钩子函数中使用它:

    add_action( 'woocommerce_order_details_after_order_table', 'track_me' );
    
    function track_me( $order ) {
    
         // The Order ID
         $order_id = $order->get_id();
    
         // your code goes below
    }
    

    现在在插件中,在类中,您将替换:

    add_action( 'woocommerce_order_details_after_order_table', 'track_me' );
    

    作者:

    add_action( 'woocommerce_order_details_after_order_table', array( $this, 'track_me' ) );
    

    加法:

    由于您无法从插件中获取 $order 对象,您也应该尝试:

    add_action( 'woocommerce_order_details_after_order_table', 'track_me' );
    
    function track_me( $order ) {
    
         if ( ! is_a( $order, 'WC_Order' ) ) {
             global $order;
         }
    
         // The Order ID
         $order_id = $order->get_id();
    
         // your code goes below
    }
    

    我不能告诉你更多的事情

    【讨论】:

    • 我认为我迷失的部分是班级内部部分。我的插件没有类(目前,虽然我确实尝试过)。如果我创建一个类 MY_WC_Order 来扩展 WC_Order,它如何与动作挂钩交互?
    • 如果您的插件不使用 OOP 且没有类,则使用 add_action( 'woocommerce_order_details_after_order_table', 'track_me' ); ...您使用什么版本的 WooCommerce?
    • Woo 是 v 3.7.0。我先在没有上课的情况下尝试过,那也没有用。我收到 $order 未定义的错误。当我在全局变量中查看 $order 时,它不是一个对象,它的内容只是“DESC”,所以我认为变量 $order 会在其他地方重新定义。我正在研究另一个可以访问 $order_id 的第三方插件,但我不知道它是如何做到的。
    • @JessycaFrederick 正如您在模板上看到的那样,$order 变量包含在这个钩子中,所以我不知道您告诉您的更多信息……我在答案中添加了一个附加项,但是我不确定这会解决这个问题。
    • 非常感谢。有一些我不明白的基本概念,但我的 hack 有效,所以我现在会坚持下去,直到我学会了足够的知识来弄清楚我做错了什么;)
    【解决方案2】:

    我不是专家,但也许……。像这样可以工作:

    global $order_id;
    $order = wc_get_order($order_id);
    
    

    【讨论】:

    • $order_id 不是可用的全局变量。
    猜你喜欢
    • 1970-01-01
    • 2016-02-12
    • 2021-04-21
    • 2012-09-26
    • 2017-06-10
    • 1970-01-01
    • 2017-09-17
    • 2020-11-18
    • 2021-06-21
    相关资源
    最近更新 更多