Add custom fields as cart item meta and order item meta in WooCommerce

徘徊边缘 提交于 2019-11-30 16:57:11

Update (related to comments):

  • Limit the functionality to only one product ID
  • Add all checkboxes values as a coma separated string

To get easily the label names of your checkboxes as values and to "refactor to help include more checkboxes options would be helpful to reduce written code" I have added a simple function where you will set the key/value pairs for each checkbox you want to display and process…

So I have revisited all your code:

// HERE set the array of pairs keys/values for your checkboxes
function custom_checkboxes(){
    return array(
        'mm_chicken_cutlet_bento'       => __( "Chicken Cutlet Bento", "aoim"),
        'mm_roasted_pork_rib_bento'     => __( "Roasted Pork Rib Bento", "aoim"),
    );
}

// Displaying the checkboxes
add_action( 'woocommerce_before_add_to_cart_button', 'add_fields_before_add_to_cart' );
function add_fields_before_add_to_cart( ) {
    global $product;
    if( $product->get_id() != 2 ) return; // Only for product ID "2"

    ?>
    <div class="simple-selects">
        <div class="col-md-6">
            <h3><?php _e("Main meals", "aoim"); ?></h3>
            <?php foreach( custom_checkboxes() as $key => $value ): ?>
                <p><input type="checkbox" name="<?php echo $key; ?>" id="<?php echo $key; ?>"><?php echo ' ' . $value; ?></p>
            <?php endforeach; ?>
        </div>
    </div>
    <?php
}


// Add data to cart item
add_filter( 'woocommerce_add_cart_item_data', 'add_cart_item_data', 25, 2 );
function add_cart_item_data( $cart_item_data, $product_id ) {
    if( $product_id != 2 ) return $cart_item_data; // Only for product ID "2"

    // Set the data for the cart item in cart object
    $data = array() ;

    foreach( custom_checkboxes() as $key => $value ){
        if( isset( $_POST[$key] ) )
            $cart_item_data['custom_data'][$key] = $data[$key] = $value;
    }
    // Add the data to session and generate a unique ID
    if( count($data > 0 ) ){
        $cart_item_data['custom_data']['unique_key'] = md5( microtime().rand() );
        WC()->session->set( 'custom_data', $data );
    }
    return $cart_item_data;
}


// Display custom data on cart and checkout page.
add_filter( 'woocommerce_get_item_data', 'get_item_data' , 25, 2 );
function get_item_data ( $cart_data, $cart_item ) {
    if( $cart_item['product_id'] != 2 ) return $cart_data; // Only for product ID "2"

    if( ! empty( $cart_item['custom_data'] ) ){
        $values =  array();
        foreach( $cart_item['custom_data'] as $key => $value )
            if( $key != 'unique_key' ){
                $values[] = $value;
            }
        $values = implode( ', ', $values );
        $cart_data[] = array(
            'name'    => __( "Option", "aoim"),
            'display' => $values
        );
    }

    return $cart_data;
}

// Add order item meta.
add_action( 'woocommerce_add_order_item_meta', 'add_order_item_meta' , 10, 3 );
function add_order_item_meta ( $item_id, $cart_item, $cart_item_key ) {
    if ( isset( $cart_item[ 'custom_data' ] ) ) {
        $values =  array();
        foreach( $cart_item[ 'custom_data' ] as $key => $value )
            if( $key != 'unique_key' ){
                $values[] = $value;
            }
        $values = implode( ', ', $values );
        wc_add_order_item_meta( $item_id, __( "Option", "aoim"), $values );
    }
}

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

Tested and works.


You will get something like this:

I have added "Option", as label to avoid the value repetition…

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!