Add extra meta for orders in Woocommerce

前端 未结 4 1057
遇见更好的自我
遇见更好的自我 2020-11-28 09:24

I\'m creating a custom plugin for my website.

In some part of this plugin I need to store extra meta in wp_postmeta for each orders.

I added thi

相关标签:
4条回答
  • 2020-11-28 09:54

    The 2018 way:

    Built on Guido W.P. answer you can use instead woocommerce_checkout_create_order action hook in a more lighter and effective version code (using WC 3+ CRUD methods):

    add_action('woocommerce_checkout_create_order', 'before_checkout_create_order', 20, 2);
    function before_checkout_create_order( $order, $data ) {
        $order->update_meta_data( '_custom_meta_key', 'value' );
    }
    

    Code goes in function.php file of your active child theme (or active theme).

    Tested and works in WooCommerce 3+ (only).


    SOME EXPLANATIONS:

    The woocommerce_checkout_create_order action hook is just one step before saving the order data. See below in an extract of the WC_Checkout create_order() method (with both hooks):

    /**
     * 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();
    
    do_action( 'woocommerce_checkout_update_order_meta', $order_id, $data );
    
    return $order_id;
    

    Why using woocommerce_checkout_create_order instead?:

    • Because You don't need to use $order = wc_get_order( $order_id ); as you already got $order as an argument in the hooked function.
    • You don't need to use $order->save(); as this will be done just after anyway (see the source code)
    • This hook has been released since WooCommerce version 3 and it's made for the same purpose, allowing to use all available WC_Order methods.

    So this just works with a single line of code inside the function.

    0 讨论(0)
  • 2020-11-28 10:04

    Building on Mo Saeedi answer, I believe this snippet is more in line with the new CRUD approach introduced by WooCommerce 3.0:

    add_action('woocommerce_checkout_update_order_meta',function( $order_id, $posted ) {
        $order = wc_get_order( $order_id );
        $order->update_meta_data( 'my_custom_meta_key', 'my data' );
        $order->save();
    } , 10, 2);
    

    See also this threads on the WordPress forums:

    • Oh CRUD! Custom Meta to order from cart
    • What is the correct way to update meta fields in Woocommerce?
    0 讨论(0)
  • 2020-11-28 10:05

    answer is: I should use woocommerce_checkout_update_order_meta for add_action and also i should simply use update_post_meta() to add extra meta to my order

        function add_item_meta( $order_id ) {
                //global $woocommerce;
                update_post_meta( $order_id, '_has_event', 'yes' );
            } 
    
    0 讨论(0)
  • 2020-11-28 10:07

    The 2016 way:

    add_action('woocommerce_checkout_update_order_meta',function( $order_id, $posted ) {  
        update_post_meta( $order_id, 'my_custom_meta_key', 'my data' );  
    } , 10, 2);
    
    • $order_id is the id of the order, which is stored as a custom post type
    • $posted is all the data from $_POST
    0 讨论(0)
提交回复
热议问题