I am trying to create a column that shows notes to customers. I want this column in both woocommerce admin and customer order table. I found this code and it is showing all notes in admin. How do I alter it to show only public notes I wrote to the customer? Also, how do I alter it to show on customer my order page as well?
// Code goes in functions.php for your child theme
// not tested in a PHP snippet plugin
// Add column "Order Notes" on the orders page
add_filter( 'manage_edit-shop_order_columns', 'add_order_notes_column' );
function add_order_notes_column( $columns ) {
$new_columns = ( is_array( $columns ) ) ? $columns : array();
$new_columns['order_notes'] = 'Order Notes';
return $new_columns;
}
add_action( 'admin_print_styles', 'add_order_notes_column_style' );
function add_order_notes_column_style() {
$css = '.post-type-shop_order table.widefat.fixed { table-layout: auto; width: 100%; }';
$css .= 'table.wp-list-table .column-order_notes { min-width: 280px; text-align: left; }';
$css .= '.column-order_notes ul { margin: 0 0 0 18px; list-style-type: disc; }';
$css .= '.order_customer_note { color: #ee0000; }'; // red
$css .= '.order_private_note { color: #0000ee; }'; // blue
wp_add_inline_style( 'woocommerce_admin_styles', $css );
}
// Add order notes to the "Order Notes" column
add_action( 'manage_shop_order_posts_custom_column', 'add_order_notes_content' );
function add_order_notes_content( $column ) {
if( $column != 'order_notes' ) return;
global $post, $the_order;
if( empty( $the_order ) || $the_order->get_id() != $post->ID ) {
$the_order = wc_get_order( $post->ID );
}
$args = array();
$args['order_id'] = $the_order->get_id();
$args['order_by'] = 'date_created';
$args['order'] = 'ASC';
$notes = wc_get_order_notes( $args );
if( $notes ) {
print '<ul>';
foreach( $notes as $note ) {
if( $note->customer_note ) {
print '<li class="order_customer_note">';
} else {
print '<li class="order_private_note">';
}
$date = date( 'm/d/y H:i', strtotime( $note->date_created ) );
print $date.' by '.$note->added_by.'<br>'.$note->content.'</li>';
}
print '</ul>';
}
} // end function
First the rule on stackOverFlow is one question at the time.
To only display public order notes send to customer in a custom column on admin orders list, use the following revisited code:
// Add custom column on admin orders list page
add_filter( 'manage_edit-shop_order_columns', 'add_order_notes_column' );
function add_order_notes_column( $columns ) {
$columns['order_notes'] = 'Order Notes';
return $columns;
}
// CSS styles
add_action( 'admin_print_styles', 'add_order_notes_column_style' );
function add_order_notes_column_style() {
$css = '.post-type-shop_order table.widefat.fixed { table-layout: auto; width: 100%; }';
$css .= 'table.wp-list-table .column-order_notes { min-width: 280px; text-align: left; }';
$css .= '.column-order_notes ul { margin: 0 0 0 18px; list-style-type: disc; }';
// $css .= '.order_customer_note { color: #ee0000; }'; // red
// $css .= '.order_private_note { color: #0000ee; }'; // blue
wp_add_inline_style( 'woocommerce_admin_styles', $css );
}
// Admin orders list custom column displayed content
add_action( 'manage_shop_order_posts_custom_column', 'add_order_notes_content' );
function add_order_notes_content( $column ) {
global $post, $the_order;
if( 'order_notes' !== $column )
return;
$order = is_a($the_order, 'WC_Order') ? $the_order : wc_get_order( $post->ID );
$notes = wc_get_order_notes( array(
'order_id' => $order->get_id(),
'order_by' => 'date_created',
'order' => 'ASC',
) );
if( ! empty($notes) ) {
echo '<ul>';
foreach( $notes as $note ) {
if( $note->customer_note && 'system' !== $note->added_by ) {
echo '<li class="order_customer_note">' . sprintf( __('%s by %s <br> %s:'),
date_i18n( 'm/d/y H:i', strtotime( $note->date_created ) ),
$note->added_by,
$note->content
) . '</li>';
}
}
echo '</ul>';
}
}
Code goes in functions.php file of the active child theme (or active theme). Tested and works.