phpjquerywordpresswoocommercecustom-fields

Add a product note field in single product pages in Woocommerce


I want create custom order note in single product detail page for user. This one can do using php without plugin. I have attached screenshot and site URL for reference.

The have tried with this code in function.php its working on checkout page not in product detail page. Anyone help me to achieve this.

add_action('woocommerce_after_order_notes', 'customise_checkout_field');

    function customise_checkout_field($checkout)
    {
    echo '<div id="customise_checkout_field"><h2>' . __('Heading') . '</h2>';
    woocommerce_form_field('customised_field_name', array(
    'type' => 'text',
    'class' => array(
    'my-field-class form-row-wide'
    ) ,
    'label' => __('Customise Additional Field') ,
    'placeholder' => __('Guidence') ,
    'required' => true,
    ) , $checkout->get_value('customised_field_name'));
    echo '</div>';
    }

website url

enter image description here


Solution

  • To make it work as you want try the following code where your product note will be displayed in the product page below the product meta. In my code, I have added a hidden field in the add to cart form, and some jQuery code will add the content of the textarea field into the hidden field on the fly. This way the product note can be saved afterwards in the cart item as custom data.

    Now this answer will not handle saving the data in the order and display it after checkout, as this is not explicit and too broad for this question.

    // Add a custom product note below product meta in single product pages
    add_action('woocommerce_single_product_summary', 'custom_product_note', 100 );
    function custom_product_note() {
    
        echo '<br><div>';
    
        woocommerce_form_field('customer_note', array(
            'type' => 'textarea',
            'class' => array( 'my-field-class form-row-wide') ,
            'label' => __('Product note') ,
            'placeholder' => __('Add your note here, please…') ,
            'required' => false,
        ) , '');
    
        echo '</div>';
    
        //
        ?>
        <script type="text/javascript">
        jQuery( function($){
            $('#customer_note').on( 'input blur', function() {
                $('#product_note').val($(this).val());
            });
         });
        </script>
    
        <?php
    }
    
    // Custom hidden field in add to cart form
    add_action( 'woocommerce_before_add_to_cart_button', 'hidden_field_before_add_to_cart_button', 5 );
    function hidden_field_before_add_to_cart_button(){
        echo '<input type="hidden" name="product_note" id="product_note" value="">';
    }
    
    // Add customer note to cart item data
    add_filter( 'woocommerce_add_cart_item_data', 'add_product_note_to_cart_item_data', 20, 2 );
    function add_product_note_to_cart_item_data( $cart_item_data, $product_id ){
        if( isset($_POST['product_note']) && ! empty($_POST['product_note']) ){
            $product_note = sanitize_textarea_field( $_POST['product_note'] );
            $cart_item_data['product_note'] = $product_note;
        }
        return $cart_item_data;
    }
    

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

    enter image description here


    If you want to display this field after add to cart button, you will use this shorter code:

    // Add a custom product note after add to cart button in single product pages
    add_action('woocommerce_after_add_to_cart_button', 'custom_product_note', 10 );
    function custom_product_note() {
    
        echo '<br><div>';
    
        woocommerce_form_field('product_note', array(
            'type' => 'textarea',
            'class' => array( 'my-field-class form-row-wide') ,
            'label' => __('Product note') ,
            'placeholder' => __('Add your note here, please…') ,
            'required' => false,
        ) , '');
    
        echo '</div>';
    }
    
    // Add customer note to cart item data
    add_filter( 'woocommerce_add_cart_item_data', 'add_product_note_to_cart_item_data', 20, 2 );
    function add_product_note_to_cart_item_data( $cart_item_data, $product_id ){
        if( isset($_POST['product_note']) && ! empty($_POST['product_note']) ){
            $product_note = sanitize_textarea_field( $_POST['product_note'] );
            $cart_item_data['product_note'] = $product_note;
        }
        return $cart_item_data;
    }
    

    enter image description here

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


    This custom cart item data is accessible this way:

    foreach( WC()->cart->get_cart() as $cart_item ){
        if( isset($cart_item['product_note']) )
           echo $cart_item['product_note'];
    }