管理员创建订单的WooCommerce挂钩

4
在我的自定义插件中(在WooCommerce 2.6.x和3.x中工作),当新订单创建时,我需要获取订单ID。我尝试了不同的钩子,但它们只在客户创建订单时起作用,而不是在管理员创建订单时起作用。
我尝试过:
- woocommerce_new_order - woocommerce_thankyou - woocommerce_checkout_order_processed - woocommerce_checkout_update_order_meta 更新 最终我使用了这个:
add_action('wp_insert_post', function($order_id)
{
    if(!did_action('woocommerce_checkout_order_processed') 
        && get_post_type($order_id) == 'shop_order'
        && validate_order($order_id))
    {
         order_action($order_id);
    }
});

其中validate_order是:

function validate_order($order_id)
{
    $order = new \WC_Order($order_id);
    $user_meta = get_user_meta($order->get_user_id());
    if($user_meta)
        return true;
    return false;
}

感谢validate_order,当您开始创建订单时,该操作不会被执行。我使用!did_action('woocommerce_checkout_order_processed'),因为如果订单是由客户创建的,我不希望执行该操作(我有一个针对此情况的特定操作,使用woocommerce_checkout_order_processed)。

希望这个能为您解决问题:WC()->order->id; - stevenkellow
3个回答

5

woocommerce_new_order 钩子在创建订单后被调用:

add_action('woocommerce_new_order', function ($order_id) {
    // ...
}, 10, 1);

这对我有用。WP 5.9.3,WC 5.6.2。使用如下:add_action('woocommerce_new_order', callback_function(), 10, 1); - khalifmahdi

2
如果您正在使用管理页面.../wp-admin/post-new.php?post_type=shop_order创建新订单,那么可能没有WooCommerce钩子来执行此操作,因为此订单是由WordPress核心创建的。
但是,WordPress动作'save_post_shop_order'将使用$post_ID调用,该ID是订单ID。
请参阅...\wp-includes\post.php中的函数wp_insert_post()

谢谢!当订单被创建和每次订单更新时,都会调用save_post_shop_order操作。这对我来说几乎是好的,但是否有一个只在订单创建时调用的操作?(也许在...\wp-includes\post.php中的{$new_status}_{$post->post_type},但new_shop_order不起作用) - Vixent
动作“save_post_shop_order”有一个布尔参数$update,该参数在创建文章时为false。 - user8158124
好的。问题在于当您从管理员界面点击“创建订单”按钮时,在开始填写订单字段之前,会调用save_post_shop_order操作。因此,我得到了一个空订单的订单ID。实际上,如果您退出订单创建页面并尝试创建新订单,则订单ID是一个新值。最好使用一个仅在管理员单击“保存/添加订单”按钮并且订单显示在订单表中时才调用的操作。 - Vixent
另一个问题,仅在WooCommerce 3.x中,使用save_post_shop_order即使管理员点击按钮保存订单,订单也是不完整的,没有客户数据。只有当管理员第二次保存订单时,订单才是完整的。 - Vixent
抱歉回复晚了,当管理员点击创建订单按钮并且订单在订单表中显示时,我想要“做某些事情”。如果订单没有显示,我就不想做任何事情。当管理员重新打开订单并再次点击保存更改的按钮时,我也想做同样的事情。当需要“做某些事情”时,我希望获取订单的所有数据,因此我不想获取空订单。 - Vixent
显示剩余2条评论

1
您可以使用此挂钩woocommerce_process_shop_order_meta,当从WordPress管理面板手动创建订单时,它将被触发。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接