【问题标题】:Can't get shipping methods from order in woocommerce extension but can in theme无法从 woocommerce 扩展中的订单获取运输方式,但可以在主题中
【发布时间】:2014-11-18 12:23:08
【问题描述】:

我正在开发一个 woocommerce 扩展程序,并在我的一个类中包含以下代码部分。

$order = new WC_Order(159); 
$shipping_methods = $order->get_shipping_methods(); 
print_r($shipping_methods); 

这将返回一个空数组,如此处所示。

[24-Sep-2014 04:05:02 UTC] Array
(
)

如果我在主题中放置完全相同的代码,而不是按预期填充数组并返回以下内容

Array
(
[10] => Array
    (
        [name] => International Delivery
        [type] => shipping
        [item_meta] => Array
            (
                [method_id] => Array
                    (
                        [0] => international_delivery
                    )

                [cost] => Array
                    (
                        [0] => 175
                    )

            )

        [method_id] => international_delivery
        [cost] => 175
    )
)

我已经尝试过调试它,但我终其一生都无法弄清楚我错过了什么。相同的三行代码在主题中有效,但在插件中无效。我错过了一个全局变量或其他变量吗?

编辑:

我正在创建的订单对象已经是一个完整的订单,我只是从中查询信息。我不确定这是否是下面建议的加载问题。

当我 var_dump $order 时,它也向我展示了订单对象。 WC_Abstract_Order 继承的方法在这一点上不起作用有什么原因吗?

WP_DEBUG 已打开,没有产生错误或警告。

还要注意,这是在扩展WC_Email 的类中。

编辑2:

我已经在我的 WC_Email 触发方法中找到了 $order 对象被弄乱的地方。

调用此过滤器woocommerce_order_get_items 会破坏$order 对象。

add_filter( 'woocommerce_order_get_items', array( $this, 'check_items' ), 10, 2 );

这是我的代码行,如果我禁用它,我就可以访问get_shipping_methods().

【问题讨论】:

    标签: wordpress woocommerce shipping


    【解决方案1】:

    事实证明,之前的开发人员正在迭代 $items 并错误地取消设置行项目。在经历了很多挫折之后,我修复了 line_item vs shipping item 的检测,现在代码正在运行。

    然后将其传递给$order 对象的所有过滤器,从而有效地删除了所有运输信息的痕迹。始终检查代码行。我确实发现 2 个用于更改订单项的过滤器会在调用中持久保留对象,这就是它删除运输信息的原因。

    【讨论】:

    • 有时处理别人的代码会让你的头发变白。
    【解决方案2】:

    您是否启用了 WP_DEBUG 模式?如果是这样,我希望看到一些致命错误,例如 get_shipping_methods() 不存在或可能“调用非对象上的成员函数”,这两者都会使 $order 未定义,因此当您 @987654324 时为空@它。

    插件在主题之前加载(请参阅Action Hooks Reference),因此在调用主题时 WooCommerce 已完全加载。在加载 WooCommerce 之前,您的插件可能正在运行。

    我会尝试在稍后的钩子上运行您的代码,例如 plugins_loaded 或 WooCommerce 特定的 woocommerce_loaded

    【讨论】:

    • WITH WP_DEBUG on 我没有收到您建议的任何错误。我已经在 var_dumping $order 并且正在创建它。在加载我的插件之前,我也遵循检查 woocommerce 的标准。我尝试使用 woocommerce_loaded 钩子,但这会破坏插件。
    • 我也已经在使用 plugins_loaded 来初始化我的插件了。我还觉得有趣的是,这是为了获取有关已经完成的订单的信息。我只是在查询它。
    • 那么我有点不知所措。如果它们尚未加载,您会看到错误。
    • 无论如何感谢您的建议。这就是我如此困惑的原因。
    • 我在我的一个 WooCommerce 插件中测试了您的代码,只要订单中有需要运输的物品,我就会看到返回的数组。如果订单没有发货,那么我会得到一个空数组。既然您说您使用了相同的代码(并且可能是相同的订单号),这让我更加困惑。我会尝试禁用其他插件和你的主题,看看是否有任何冲突,但是我卡住了。
    猜你喜欢
    • 1970-01-01
    • 2020-08-12
    • 2013-06-14
    • 2014-09-25
    • 2018-05-08
    • 2020-08-31
    • 2019-12-18
    • 1970-01-01
    • 2018-05-05
    相关资源
    最近更新 更多