WebArtisan
WebArtisan

Reputation: 4227

Add a custom cart item value to WooCommerce order item meta data

I'm trying add order item meta and expect to see it in my {prefix}woocommerce_order_itemmeta table when user submit order.

I add my value with woocommerce_add_cart_item_data filter:

add_filter( 'woocommerce_add_cart_item_data', 'aa_func_20170206100217', 10, 3 );
function aa_func_20170206100217( $cart_item_data, $product_id, $variation_id ) {
    $data = $_POST;

    if ( isset( $data[ 'selected_date_event' ] ) ) {
        $selected_date_event = [
            'selected_date_event' => $data[ 'selected_date_event' ]
        ];

        return array_merge( $cart_item_data, $selected_date_event );
    }

    return $cart_item_data;
}

And this is works. When I var_dump my cart, there definitely my param exists.

enter image description here

But when user submit order, I can't find this param in my db.

What did I miss? How it can be stored in order item meta? And which is proper hook for this thing?

Upvotes: 3

Views: 10144

Answers (2)

Maulik patel
Maulik patel

Reputation: 2432

add_filter( 'woocommerce_add_cart_item_data', 'aa_func_20170206100217', 10, 3 );
function aa_func_20170206100217( $cart_item_data, $product_id, $variation_id ) {
    $data = $_POST;

    if ( isset( $data[ 'selected_date_event' ] ) ) {
        $selected_date_event = [
            'selected_date_event' => $data[ 'selected_date_event' ]
        ];

        return array_merge( $cart_item_data, $selected_date_event );
    }

    return $cart_item_data;
}
add_filter( 'woocommerce_get_cart_item_from_session', function ( $cartItemData, $cartItemSessionData, $cartItemKey ) {
    if ( isset( $cartItemSessionData['selected_date_event'] ) ) {
        $cartItemData['selected_date_event'] = $cartItemSessionData['selected_date_event'];
    }

    return $cartItemData;
}, 10, 3 );

add_filter( 'woocommerce_get_item_data', function ( $data, $cartItem ) {
    if ( isset( $cartItem['selected_date_event'] ) ) {
        $data[] = array(
            'name' => 'selected_date_event',
            'value' => $cartItem['selected_date_event']
        );
    }

    return $data;
}, 10, 2 );

add_action( 'woocommerce_add_order_item_meta', function ( $itemId, $values, $key ) {
    if ( isset( $values['myCustomData'] ) ) {
        wc_add_order_item_meta( $itemId, 'selected_date_event', $values['selected_date_event'] );
    }
}, 10, 3 );

Upvotes: -1

LoicTheAztec
LoicTheAztec

Reputation: 253784

You need to save this data in order item meta data:

// ADD THE INFORMATION AS ORDER ITEM META DATA SO THAT IT CAN BE SEEN AS PART OF THE ORDER
add_action('woocommerce_add_order_item_meta','add_product_custom_field_to_order_item_meta', 9, 3 );
function add_product_custom_field_to_order_item_meta( $item_id, $item_values, $item_key ) {
    // the meta-key is 'Date event' because it's going to be the label too
    if( ! empty( $item_values['selected_date_event'] ) )
        wc_update_order_item_meta( $item_id, 'Date event', sanitize_text_field( $item_values['selected_date_event'] ) );
}

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

This code is tested and works.

So this will be displayed in Order item data on Order-received, my account Order view and in email notifications.

Upvotes: 4

Related Questions