I added a new column of completed date in the woocommerce order list page using the code here. The new column shows sorting buttons (up/down arrows) properly but when clicked, seems like it sorts on order ID rather than the completed date and it always sorts only ASC one way no matter how many times I click.
// 1
add_filter( 'woocommerce_shop_order_list_table_columns', function ( $columns ) {
if ( isset( $columns['order_date'] ) ) {
unset( $columns['order_date'] );
}
$new = [];
foreach ( $columns as $key => $label ) {
$new[$key] = $label;
if ( 'order_number' === $key ) {
$new['completed_date'] = __( 'Completed', 'woocommerce' );
}
}
return $new;
}, 20 );
// 2
add_action( 'woocommerce_shop_order_list_table_custom_column', function( $column, $order ) {
if ( 'completed_date' !== $column ) {
return;
}
if ( ! is_a( $order, 'WC_Order' ) ) return;
$date = $order->get_date_completed();
echo $date ? esc_html( wc_format_datetime( $date, get_option('date_format').' '.get_option('time_format') ) ) : '—';
}, 10, 2 );
// 3
add_filter( 'woocommerce_shop_order_list_table_sortable_columns', function( $columns ) {
$columns['completed_date'] = 'completed_date';
return $columns;
} );
// 4
add_action( 'pre_get_posts', function( $query ) {
global $pagenow, $typenow;
if ( ! is_admin() || 'edit.php' !== $pagenow || 'shop_order' !== $typenow || ! $query->is_main_query() ) {
return;
}
$orderby = $query->get( 'orderby' );
if ( 'completed_date' === $orderby ) {
$query->set( 'meta_key', '_date_completed' );
$query->set( 'orderby', 'meta_value' );
$query->set( 'meta_type', 'DATETIME' );
}
} );
Note that I've also tried the code below for part 4 but didn't work either
// 4 (2)
function action_parse_query( $query ) {
global $pagenow;
$query_vars = &$query->query_vars;
if ( is_admin() && $query->is_main_query() && $pagenow == 'edit.php' && $query_vars['post_type'] == 'shop_order' ) {
$query->set( 'orderby', 'completed_date' );
$query->set( 'order', 'ASC' );
}
}
add_action( 'parse_query', 'action_parse_query', 10, 1 );
Please kindly help if the code should be adjusted to sort it properly. Many thanks.