diff --git a/plugins/woocommerce/changelog/fix-34145 b/plugins/woocommerce/changelog/fix-34145 new file mode 100644 index 00000000000..6d91885a1a1 --- /dev/null +++ b/plugins/woocommerce/changelog/fix-34145 @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +Honor 'show_in_admin_all_list' and 'show_in_admin_status_list' in COT orders list table. diff --git a/plugins/woocommerce/src/Internal/Admin/Orders/ListTable.php b/plugins/woocommerce/src/Internal/Admin/Orders/ListTable.php index c2f1479b722..e8337eadb84 100644 --- a/plugins/woocommerce/src/Internal/Admin/Orders/ListTable.php +++ b/plugins/woocommerce/src/Internal/Admin/Orders/ListTable.php @@ -173,10 +173,10 @@ class ListTable extends WP_List_Table { 'limit' => $limit, 'page' => $this->get_pagenum(), 'paginate' => true, - 'status' => sanitize_text_field( wp_unslash( $_REQUEST['status'] ?? 'any' ) ), 'type' => 'shop_order', ); + $this->set_status_args(); $this->set_order_args(); $this->set_date_args(); $this->set_customer_args(); @@ -253,6 +253,26 @@ class ListTable extends WP_List_Table { $this->has_filter = true; } + /** + * Implements filtering of orders by status. + */ + private function set_status_args() { + $status = trim( sanitize_text_field( wp_unslash( $_REQUEST['status'] ?? '' ) ) ); + $query_statuses = array(); + + if ( empty( $status ) || 'all' === $status ) { + $query_statuses = array_intersect( + array_keys( wc_get_order_statuses() ), + get_post_stati( array( 'show_in_admin_all_list' => true ), 'names' ) + ); + } else { + $query_statuses[] = $status; + $this->has_filter = true; + } + + $this->order_query_args['status'] = $query_statuses; + } + /** * Get the list of views for this table (all orders, completed orders, etc, each with a count of the number of * corresponding orders). @@ -265,7 +285,14 @@ class ListTable extends WP_List_Table { $statuses = wc_get_order_statuses(); $current = isset( $_GET['status'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['status'] ?? '' ) ) : 'all'; - foreach ( $statuses as $slug => $name ) { + // Add 'draft' and 'trash' to list. + foreach ( array( 'draft', 'trash' ) as $wp_status ) { + $statuses[ $wp_status ] = ( get_post_status_object( $wp_status ) )->label; + } + + $statuses_in_list = array_intersect( array_keys( $statuses ), get_post_stati( array( 'show_in_admin_status_list' => true ) ) ); + + foreach ( $statuses_in_list as $slug ) { $total_in_status = $this->count_orders_by_status( $slug ); if ( $total_in_status > 0 ) { @@ -274,7 +301,7 @@ class ListTable extends WP_List_Table { } $all_count = array_sum( $view_counts ); - $view_links['all'] = $this->get_view_link( 'all', __( 'All', 'woocommerce' ), $all_count, $current === 'all' ); + $view_links['all'] = $this->get_view_link( 'all', __( 'All', 'woocommerce' ), $all_count, '' === $current || 'all' === $current ); foreach ( $view_counts as $slug => $count ) { $view_links[ $slug ] = $this->get_view_link( $slug, $statuses[ $slug ], $count, $slug === $current ); @@ -286,8 +313,6 @@ class ListTable extends WP_List_Table { /** * Count orders by status. * - * @todo review and replace (probably not ideal to do this work here). - * * @param string $status The order status we are interested in. * * @return int @@ -348,11 +373,11 @@ class ListTable extends WP_List_Table { /** * Render the months filter dropdown. * - * @todo [review] we may prefer to move this logic outside of the ListTable class - * * @return void */ private function months_filter() { + // XXX: [review] we may prefer to move this logic outside of the ListTable class. + global $wp_locale; global $wpdb; @@ -612,10 +637,17 @@ class ListTable extends WP_List_Table { } } - if ( $tooltip ) { - printf( '%s', esc_attr( sanitize_html_class( 'status-' . $order->get_status() ) ), wp_kses_post( $tooltip ), esc_html( wc_get_order_status_name( $order->get_status() ) ) ); + // Gracefully handle legacy statuses. + if ( in_array( $order->get_status(), array( 'trash', 'draft' ), true ) ) { + $status_name = ( get_post_status_object( $order->get_status() ) )->label; } else { - printf( '%s', esc_attr( sanitize_html_class( 'status-' . $order->get_status() ) ), esc_html( wc_get_order_status_name( $order->get_status() ) ) ); + $status_name = wc_get_order_status_name( $order->get_status() ); + } + + if ( $tooltip ) { + printf( '%s', esc_attr( sanitize_html_class( 'status-' . $order->get_status() ) ), wp_kses_post( $tooltip ), esc_html( $status_name ) ); + } else { + printf( '%s', esc_attr( sanitize_html_class( 'status-' . $order->get_status() ) ), esc_html( $status_name ) ); } }