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

后端 未结 1 760
生来不讨喜
生来不讨喜 2021-01-03 16:27

This is a plugin on how to add add cart item meta & order item meta for my WooCommerce order. Initially my code below worked well for input type=text. It returns the lab

1条回答
  •  旧巷少年郎
    2021-01-03 17:02

    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"
    
        ?>
        

    $value ): ?>

    $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…

    0 讨论(0)
提交回复
热议问题