Search code examples
phpwordpresswoocommercehook-woocommercecheckout

Add order items in customer notes field


I am trying to add ordered products (quantity per product per line) in customer added notes field for new WooCommerce orders. I introduced the following code in my functions.php but it was not working.

/* Add ordered products to the customer notes field on order creation. */
add_action( ‘woocommerce_new_order’, ‘products_in_customer_notes’, 10, 1 );

function products_in_customer_notes( $order_id ) {
    $order = wc_get_order( $order_id );
    
    // Verify it's a WC Order
    if ( is_a( $order, 'WC_Order' ) ) {
        $customer_note = $order->get_customer_note();
        
        foreach ( $order->get_items() as $item_id => $item ) {
            $product_name = $item->get_name();
            $quantity = $item->get_quantity();
            $customer_note .= "<br>";
            $customer_note .= $quantity . 'x ' . $product_name;
        }

        // Add the note
        $order->set_customer_note($customer_note);
        // $order->add_order_note($customer_note);

        // Save the data
        $order->save();
    }
}

When that didn't work, I tried to simplify my code by hardcoding a comment instead, but that didn't work either.

/* Add ordered products to the customer notes field on order creation. */
add_action( ‘woocommerce_new_order’, ‘products_in_customer_notes’, 10, 1 );

function products_in_customer_notes( $order_id ) {
    $order = wc_get_order( $order_id );
    
    // Verify it's a WC Order
    if ( is_a( $order, 'WC_Order' ) ) {
        $customer_note = $order->get_customer_note();
        $customer_note .= '<br>';
        $customer_note .= 'Hardcoded Test';

        //  foreach ( $order->get_items() as $item_id => $item ) {
        //      $product_name = $item->get_name();
        //      $quantity = $item->get_quantity();
        //      $customer_note .= "<br>";
        //      $customer_note .= $quantity . 'x ' . $product_name;
        //  }

        // Add the note
        $order->set_customer_note($customer_note);
        // $order->add_order_note($customer_note);

        // Save the data
        $order->save();
    }
}

What is it that I am missing that is preventing this from working?

The desired output would be something like the following:

Any customer notes if they were inserted at the time of order placement. 
1x product A
3x product B
8x product C
etc.

Solution

  • add_action( 'woocommerce_new_order', 'products_in_customer_notes', 10, 2 );
    
    function products_in_customer_notes( $order_id, $order ) {
        
        // Verify it's a WC Order
        if ( is_a( $order, 'WC_Order' ) ) {
            $customer_note = $order->get_customer_note();
    
              foreach ( $order->get_items() as $item_id => $item ) {
                  $product_name = $item->get_name();
                  $quantity = $item->get_quantity();
                  $customer_note .= "<br>";
                  $customer_note .= $quantity . 'x ' . $product_name;
              }
    
            // Add the note
            $order->set_customer_note($customer_note);
    
            // Save the data
            $order->save();
        }
    }
    

    You were missing the parameter count(2), $order_id, $order