Search code examples
phpsqlwordpresswoocommerceorders

Get Order Notes from a Woocommerce Order / WC_Order object?


I can add an order note (private note) with:

$order->add_order_note($info_for_order);

But when I tried to get the values in some page with:

get_comments(['post_id' => $order_id])
// or
$order_object->get_customer_order_notes()

It simply returns an empty array. I googled this and i can't find the method to do it.


Solution

  • Order notes (private note) are only available for backend when using get_comments() function.
    If you look at WC_Comments exclude_order_comments() method you will see that front end queries are filtered regarding private order notes…

    So the turn around is to build a custom function to get the private Order notes:

    function get_private_order_notes( $order_id){
        global $wpdb;
    
        $table_perfixed = $wpdb->prefix . 'comments';
        $results = $wpdb->get_results("
            SELECT *
            FROM $table_perfixed
            WHERE  `comment_post_ID` = $order_id
            AND  `comment_type` LIKE  'order_note'
        ");
    
        foreach($results as $note){
            $order_note[]  = array(
                'note_id'      => $note->comment_ID,
                'note_date'    => $note->comment_date,
                'note_author'  => $note->comment_author,
                'note_content' => $note->comment_content,
            );
        }
        return $order_note;
    }
    

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

    This code is tested and works.


    Usage (for example the $order_id = 6238 ):

    $order_id = 6238;
    $order_notes = get_private_order_notes( $order_id );
    foreach($order_notes as $note){
        $note_id = $note['note_id'];
        $note_date = $note['note_date'];
        $note_author = $note['note_author'];
        $note_content = $note['note_content'];
    
        // Outputting each note content for the order
        echo '<p>'.$note_content.'</p>';
    }