我创建了以下插件,它应该在创建 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'
);
?>
自 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
(发布的数据).woocommerce_checkout_create_order_line_item
with 2 available arguments: $item, $cart_item_key
, $values
, $order
.如果你进入 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 );
也许你只需要使用其中之一?
简答题使用
woocommerce_checkout_order_processed
.
而不是
钩子,woocommerce_thankyou
钩子是相关的钩子。woocommerce_checkout_order_processed
钩子只会被调用一次 而且您不需要为每个产品添加元数据并制作额外的 调用保持检查代码只运行一次。作为,woocommerce_checkout_order_processed
可以调用多次也就是每次 谢谢页面加载。woocommerce_thankyou