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

qvk1mo1f  于 2023-06-21  发布在  WordPress
关注(0)|答案(3)|浏览(172)

我已经创建了以下插件,它应该在创建Woocommerce订单时向外部服务器发送POST HTTP请求。然而,这并没有发生:外部服务器上没有收到任何请求,wp-content/debug.log中没有显示任何内容(我在wp-config.php中确实有define( 'WP_DEBUG_LOG', true );)。我做错了什么?

<?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'
);

?>
3qpi33ja

3qpi33ja1#

从WooCommerce 4.3.0开始,要使用的正确钩子是woocommerce_checkout_order_created,在创建订单时向外部服务器发送POST HTTP请求。所以你的代码将是:

add_action( 'woocommerce_checkout_order_created', 'my_hooked_function_callback', 10 );

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文件中。应该能用
这个钩子位于WC_Checkout类的create_order()方法中。

    • 注意:**此代码不适用于通过admin手动创建的订单。
    • 附加说明:**
  • 要更新订单元数据一旦订单创建,您将使用带有2个可用参数的操作钩子woocommerce_checkout_update_order_meta$order_id$data(发布的数据)
  • 要在订单创建之前更新订单数据或元数据***,您将使用带有2个可用参数的操作钩子woocommerce_checkout_create_order $order * 和$data(发布的数据)*。
  • 要在订单创建之前更新订单项数据或元数据**,您将使用带有2个可用参数的操作钩子woocommerce_checkout_create_order_line_item$item*,$cart_item_key$values$order *。

相关:如何在WooCommerce 3+中调试

5jvtdoz2

5jvtdoz22#

如果你进入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 );

也许你只需要使用其中的一个。

ylamdve6

ylamdve63#

简短的回答是woocommerce_checkout_order_processed
而不是woocommerce_thankyou钩子,woocommerce_checkout_order_processed钩子是相关的钩子。woocommerce_checkout_order_processed钩子只会被调用一次,你不需要为每个产品添加 meta,也不需要进行额外的调用来检查代码是否只运行一次。因为woocommerce_thankyou可以在每次thankyou页面加载时被多次调用。
来源:https://stackoverflow.com/a/72195252/3261332

相关问题