我需要检测何时成功创建新的WooCommerce订单并设置为'processing' - 这是添加一些额外的功能等 . 这在前端可以很好,因为当通过任一方创建订单时,它很容易挂钩WooCommerce woocommerce_thankyou
或 woocommerce_order_status_processing
钩子 .
我遇到的问题是 I also want this to work when creating a new order manually via the backend of the website . 我在手动添加订单时使用了一些自定义字段,用于在创建时操作订单 . 不幸的是,虽然 woocommerce_order_status_processing
确实适用于管理订单,但它似乎在保存订单元之前触发 - 因此当我尝试检索任何元数据时它是空的 .
为了解决这个问题,我已经尝试了WooCommerce hook for order creation from admin或这个GitHub线程上的建议,即使用WordPress钩子 wp_insert_post
或 save_post_shop_order
( save_post_{$post->post_type}
) . 这可以解决我的订单元问题,因为它似乎在保存订单元后触发 .
但是 - 它会触发 everytime 有更新或新帖子,所以我需要找到一种方法来检测它是否是新帖子 . 这些钩子上有一个 $update
参数,用于显示“这是否是一个正在更新的现有帖子”,但由于某种原因,即使它是一个新的帖子/订单,它似乎总是设置为true .
总结:
- 我需要一个WordPress / WooCommerce挂钩,它是通过后端创建订单/发布元后触发的,并且只有在新创建订单而不更新订单时才运行此挂钩 .
我能想到的唯一可能做到这一点的另一种方式是检查发布日期和修改日期的this suggestion但我只是认为必须有更好的方法来做到这一点!
这是我目前的代码以防万一
function my_order_created ( $post_id, $post, $update ) {
// Don’t run if $post_id doesn’t exist OR post type is not order OR update is true
if ( ! $post_id || get_post_type( $post_id ) != 'shop_order' || $update == 1 ) {
return;
}
$order = wc_get_order( $post_id );
if ( $order && $order->has_status( 'processing' ) ){
// Do something
}
}
add_action( 'wp_insert_post', 'my_order_created', 10, 3 );
1 回答
自从已经实现CRUD methods and data stores的Woocommerce 3以来,有一些 dedicated hooks ,您可以 specifically 用于 order creation :
在Abstract_WC_Order_Data_Store_CPT create()方法中,woocommerce_new_order_data filter hook 允许您在创建之前保存函数
wp_insert_post()
中的数据 .在WC_Order_Data_Store_CPT create()方法中,woocommerce_new_order action hook 允许您在订单创建时触发一些代码 .
这是 better option ,因为它仅适用于 Woocommerce order creation .