add_filter('apto/get_order_list', 'custom_wooc_apto_get_order_list', 10, 2); function custom_wooc_apto_get_order_list( $order_list, $sort_view_id ) { //not for admin, only for Front Side if ( is_admin() ) return $order_list; global $APTO; //retrieve the sort post $sort_view_data = get_post($sort_view_id); $sortID = $sort_view_data->post_parent; //check if is a woocommerce sort if ( ! $APTO->functions->is_woocommerce($sortID) ) return $order_list; //identify the products out of stock $out_of_stock = array(); foreach ( $order_list as $key => $post_id ) { if ( get_post_meta($post_id, '_manage_stock', TRUE ) != 'yes' ) continue; if ( get_post_meta($post_id, '_stock', TRUE) < 1 ) { $out_of_stock[] = $post_id; unset( $order_list[$key] ); } } //re-index the keys $order_list = array_values($order_list); //put the OutOf Stock at the end of list if ( count ( $out_of_stock ) > 0 ) { foreach ( $out_of_stock as $post_id ) { $order_list[] = $post_id; } } return $order_list; } The above code works if Manage Stock is turned On. If the shop products does not use that and rely on Stock status the following code should be instead: add_filter('apto/get_order_list', 'custom_wooc_apto_get_order_list', 10, 2); function custom_wooc_apto_get_order_list( $order_list, $sort_view_id ) { //not for admin, only for Front Side if ( is_admin() ) return $order_list; global $APTO; //retrieve the sort post $sort_view_data = get_post($sort_view_id); $sortID = $sort_view_data->post_parent; //check if is a woocommerce sort if ( ! $APTO->functions->is_woocommerce($sortID) ) return $order_list; //identify the products out of stock $out_of_stock = array(); foreach ( $order_list as $key => $post_id ) { if ( get_post_meta($post_id, '_stock_status', TRUE) != 'instock' ) { $out_of_stock[] = $post_id; unset( $order_list[$key] ); } } //re-index the keys $order_list = array_values($order_list); //put the OutOf Stock at the end of list if ( count ( $out_of_stock ) > 0 ) { foreach ( $out_of_stock as $post_id ) { $order_list[] = $post_id; } } return $order_list; }