Mario Burga
Mario Burga

Reputation: 1157

Add custom field as item meta data on the Order

I have added a custom field to the woocommerce products, it is working well with the following code. But my problem is how to add it to the cart_item_data

// Display Text in Admin Panel 
add_action('woocommerce_product_options_general_product_data', 'product_custom_text_field');

function product_custom_text_field()
{

    // Custom Product Text Field ( para Tex Area -> woocommerce_wp_textarea_input )

    woocommerce_wp_text_input(
        array(
        'id'          => '_optional_text_field',
        'label'       => __('Customize title', 'woocommerce'),
        'placeholder' => '',
        'desc_tip' => 'true',
        'description' => __('Customizable title for the field that the user must fill out.', 'woocommerce')
        )
    );
}

Save Fields

add_action('woocommerce_process_product_meta', 'product_custom_text_field_save');

function product_custom_text_field_save($post_id)
{
    if (!empty($_POST['_optional_text_field'])) {
        update_post_meta($post_id, '_optional_text_field', esc_attr($_POST['_optional_text_field']));
    }
}

Display The Text in Product Page

    add_action('woocommerce_single_variation', 'display_text_field');

    function display_text_field()
    {
        global $post;
        if (get_post_meta($post->ID, '_optional_text_field', true)) {
            echo "<div class='titulo-c'><label>";
            echo get_post_meta($post->ID, '_optional_text_field', true);
            echo "</label></div>";
            return;
        }

        echo __('FREE LOCAL SHIPPING', 'woocommerce');
    }

So far it works without problems, now I want to add it to the cart_item_data, with the following code, but it does not work for me.

add_filter( 'woocommerce_add_cart_item_data', 'add_cart_item_data', 25, 2 );
function add_cart_item_data( $cart_item_meta, $product_id ) {

        $custom_data  = array() ;

        $custom_data[ "_optional_text_field"] = isset( $_POST['_optional_text_field'] ) ?  sanitize_text_field ( $_POST['_optional_text_field'] ) : "" ;

        $cart_item_meta ['custom_data']     = $custom_data ;


    return $cart_item_meta;
}

Display custom data on cart and checkout page.

add_filter( 'woocommerce_get_item_data', 'get_item_data' , 25, 2 );
function get_item_data ( $other_data, $cart_item ) {
    if ( isset( $cart_item [ 'custom_data' ] ) ) {
        $custom_data  = $cart_item [ 'custom_data' ];

        $other_data[] = array( 'name' => 'Title',
                    'display'  => $custom_data['_optional_text_field'] );

    }

    return $other_data;
}

As a result, it only appears to me: Title: ________

I will appreciate any suggestions to make my code work.

Upvotes: 3

Views: 808

Answers (1)

AlbertB
AlbertB

Reputation: 637

Make the following changes to your code as below, this should work.

/**
 * 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_meta, $product_id ) {


        global $woocommerce;
        $mytitle_form_data = get_post_meta($product_id, '_optional_text_field', true);

        $custom_data  = array() ;

        $custom_data[ "_optional_text_field"] = $mytitle_form_data;

        $cart_item_meta ['custom_data']     = $custom_data ;

    return $cart_item_meta;
}

Upvotes: 3

Related Questions