在 Woocommerce 3 中创建订单后使用什么钩子

问题描述 投票:0回答:3

我创建了以下插件,它应该在创建 Woocommerce 订单时向外部服务器发送 POST HTTP 请求。然而,这并没有发生:外部服务器没有收到任何请求,

wp-content/debug.log
中没有显示任何内容(我在
define( 'WP_DEBUG_LOG', true );
中确实有
wp-config.php
)。我做错了什么?

<?php
/**
 * Plugin Name: MyPlugin
 */


function my_hook($order_id) {
    $url = "https://example.com/do_something";
    $data = wp_remote_post($url, array(
        'headers'     => array(
            'Authorization' => "Token my_token",
            'Content-Type'  => 'application/json; charset=utf-8',
        ),
        'body'        => json_encode(array('order_id' => $order_id)),
        'method'      => 'POST',
        'data_format' => 'body',
    ));
}
add_action(
    'woocommerce_new_order',
    'my_hook'
);

?>
php wordpress woocommerce hook-woocommerce orders
3个回答
3
投票

自 WooCommerce 4.3.0 起,要使用的正确挂钩是

woocommerce_checkout_order_created
,在创建订单时向外部服务器发送 POST HTTP 请求。所以你的代码将是:

add_action( 'woocommerce_new_order', 'my_hooked_function_callback' );

function my_hooked_function_callback( $order ) {

    $url = "https://example.com/do_something";

    $data = wp_remote_post( $url, array(
        'headers'     => array(
            'Authorization' => "Token my_token",
            'Content-Type'  => 'application/json; charset=utf-8',
        ),
        'body'        => json_encode( array( 
           'order_id' => $order->get_id() 
        ) ),
        'method'      => 'POST',
        'data_format' => 'body',
    ) );
}

代码进入活动子主题(或活动主题)的 functions.php 文件。它应该有效。

这个钩子位于里面

create_order()
方法
WC_Checkout
类。

注意: 该代码不适用于通过管理员手动创建的订单。


补充说明:

  • 要更新订单元数据创建订单您将使用操作挂钩
    woocommerce_checkout_update_order_meta
    带有2个可用参数:
    $order_id
    $data
    (发布的数据)
    .
  • 要更新订单数据或元数据在创建订单之前您将使用动作挂钩
    woocommerce_checkout_create_order 
    带有2个可用参数:$order
    $data
    (发布的数据)
    .
  • 要更新 order items 数据或元数据 before order is created you will use instead the action hook
    woocommerce_checkout_create_order_line_item 
    with 2 available arguments: $item,
    $cart_item_key
    ,
    $values
    ,
    $order
    .

相关:如何在 WooCommerce 3 中调试


1
投票

如果你进入 class-wc-checkout 内部,你会发现 create_order 函数在结束前触发了这些钩子:

        /**
         * Action hook to adjust order before save.
         *
         * @since 3.0.0
         */
        do_action( 'woocommerce_checkout_create_order', $order, $data );

        // Save the order.
        $order_id = $order->save();

        /**
         * Action hook fired after an order is created used to add custom meta to the order.
         *
         * @since 3.0.0
         */
        do_action( 'woocommerce_checkout_update_order_meta', $order_id, $data );

        /**
         * Action hook fired after an order is created.
         *
         * @since 4.3.0
         */
        do_action( 'woocommerce_checkout_order_created', $order );

也许你只需要使用其中之一?


0
投票

简答题使用

woocommerce_checkout_order_processed
.

而不是

woocommerce_thankyou
钩子,
woocommerce_checkout_order_processed
钩子是相关的钩子。
woocommerce_checkout_order_processed
钩子只会被调用一次 而且您不需要为每个产品添加元数据并制作额外的 调用保持检查代码只运行一次。作为,
woocommerce_thankyou
可以调用多次也就是每次 谢谢页面加载。

来源:https://stackoverflow.com/a/72195252/3261332

© www.soinside.com 2019 - 2024. All rights reserved.