Stu*_*art 6 php wordpress orders woocommerce hook-woocommerce
我需要检测何时成功创建新的 WooCommerce 订单并将其设置为 \xe2\x80\x98processing\xe2\x80\x99\xe2\x80\x94 这是为了添加一些额外的功能等。这可以在前端执行,如下所示当通过 WooCommercewoocommerce_thankyou或挂钩创建订单时,it\xe2\x80\x99s 很容易挂钩woocommerce_order_status_processing。
我遇到的问题是,我也希望在通过网站后端手动创建新订单时可以使用此功能。我在手动添加订单时使用一些自定义字段,这些字段用于在创建时操作订单。不幸的是,虽然它woocommerce_order_status_processing确实适用于管理订单,但它似乎在保存订单元之前触发\xe2\x80\x94,因此当我尝试检索任何元数据时它是空的。
为了解决这个问题,我尝试了 WooCommerce 钩子上的建议,用于从管理员创建订单,或者在这个GitHub线程上尝试使用 WordPress 钩子wp_insert_post或save_post_shop_order( save_post_{$post->post_type})。这可以解决我的订单元问题,因为它似乎在保存订单元后触发。
但是\xe2\x80\x94每当有更新或新帖子时它就会触发,所以我需要找到一种方法来检测它 \xe2\x80\x99 是否是新帖子。这些钩子上有一个$update参数,旨在显示\xe2\x80\x98这是否是正在更新的现有帖子\xe2\x80\x99,但由于某种原因,即使它是一个,它似乎总是设置为true新帖子/订单。
我能想到的唯一可能做到这一点的其他方法是根据检查发布日期与修改日期的建议,但我只是认为必须有更好的方法来做到这一点!
\n\nfunction my_order_created ( $post_id, $post, $update ) {\n\n // Don\xe2\x80\x99t run if $post_id doesn\xe2\x80\x99t exist OR post type is not order OR update is true\n if ( ! $post_id || get_post_type( $post_id ) != \'shop_order\' || $update == 1 ) {\n return;\n }\n\n $order = wc_get_order( $post_id );\n\n if ( $order && $order->has_status( \'processing\' ) ){\n\n // Do something\n\n } \n\n}\n\nadd_action( \'wp_insert_post\', \'my_order_created\', 10, 3 );\nRun Code Online (Sandbox Code Playgroud)\n
Ham*_*eji 13
您可以使用woocommerce_new_order钩子:
add_action('woocommerce_new_order', function ($order_id) {
// your code
}, 10, 1);
Run Code Online (Sandbox Code Playgroud)
2023 年更新
由于 WooCommerce 3 已经实现了CRUD 方法和数据存储,因此有一些专用的挂钩,您可以专门使用它们来创建订单。:
您可以使用woocommerce_new_order 操作挂钩,允许您在创建订单时触发一些自定义代码(位于方法中WC_Order_Data_Store_CPT create())。
add_action('woocommerce_new_order', 'action_woocommerce_new_order', 10, 2);
function action_woocommerce_new_order( $order_id, $order ) {
// Here your custom action code
}
Run Code Online (Sandbox Code Playgroud)
还有woocommerce_new_order_data 过滤器挂钩,允许您在创建订单时保存数据之前过滤函数内的一些数据(位于方法中)wp_insert_post()Abstract_WC_Order_Data_Store_CPT create()
add_filter('woocommerce_new_order_data', 'action_woocommerce_new_order_data', 10, 2);
function action_woocommerce_new_order( $data_arr, $wp_error ) {
// Here your custom code to filter data
// Always return the main argument
return $data_arr;
}
Run Code Online (Sandbox Code Playgroud)
这是一个更好的选择,因为它仅用于WooCommerce 订单创建。