在WooCommerce 3中专门用于创建订单的挂钩

我需要检测何时成功创建新的WooCommerce订单并将其设置为"正在处理"--这是为了添加一些额外的功能等。在前端这样做很好,因为当通过WooCommercewoocommerce_thankyouwoocommerce_order_status_processing钩子创建订单时,很容易将其挂钩。

我遇到的问题是我也希望在通过网站后端手动创建新订单时使用此功能。我在通过手动添加订单时使用一些自定义字段,这些字段在创建时用于处理订单。遗憾的是,尽管woocommerce_order_status_processing确实适用于管理订单,但它似乎是在订单元数据保存之前触发的-因此,当我尝试检索任何元数据时,它是空的。

为了解决这个问题,我尝试了WooCommerce hook for order creation from admin或这个GitHub线程上的建议,该线程将使用WordPress钩子wp_insert_postsave_post_shop_order(save_post_{$post->post_type})。这可以解决我的订单元问题,因为它似乎在订单元保存后触发。

然而-每次有更新或新帖子时都会触发,所以我需要找到一种方法来检测它是否是新帖子。这些钩子上有一个$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 );

解决方案

您可以使用woocommerce_new_order钩子:

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

相关文章