Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Show Out of stock products at the end in Woocommerce

Tags:

Is it possible to show out of stock products at the end of a category or page in wordpress?

So the customer first see the products that are available and after that the products that are out of stock.

like image 411
RaGu Avatar asked Aug 04 '14 07:08

RaGu


People also ask

Why does WooCommerce not display out of stock products?

Go to WooCommerce -> Settings and navigate to the Products tab. Select Inventory. Check the 'Out Of Stock Visibility' option to hide out of stock items from your catalog.

How do I hide available stock quantity in WooCommerce?

Navigate to WooCommerce > Settings > Product > Inventory. There is a setting "Stock Display Format". Select the "Never Show Stock Amount" from the drop down.

How do I display stocks in WooCommerce?

If the 'Stock display format' option on WooCommerce → Settings → Products → Inventory is set to display the quantity remaining in stock, then every product will have detailed stock information.


2 Answers

This is the same as Viktor & Bogdan's answer, but without the extra Class code.

It uses the post_clause filter to modify the product query. We JOIN the wp_postmeta table to the query and prepend an orderby _stock_status clause to the existing query. This way any other orderby clauses remain in the query as well.

add_filter('posts_clauses', 'order_by_stock_status'); function order_by_stock_status($posts_clauses) {     global $wpdb;     // only change query on WooCommerce loops     if (is_woocommerce() && (is_shop() || is_product_category() || is_product_tag() || is_product_taxonomy())) {         $posts_clauses['join'] .= " INNER JOIN $wpdb->postmeta istockstatus ON ($wpdb->posts.ID = istockstatus.post_id) ";         $posts_clauses['orderby'] = " istockstatus.meta_value ASC, " . $posts_clauses['orderby'];         $posts_clauses['where'] = " AND istockstatus.meta_key = '_stock_status' AND istockstatus.meta_value <> '' " . $posts_clauses['where'];     }     return $posts_clauses; } 

You could change istockstatus.meta_value ASC to istockstatus.meta_value DESC if you for some reason wanted the Out Of Stock items first.

Tested on WP: 4.8; WC 3.0.8

like image 197
DACrosby Avatar answered Sep 19 '22 13:09

DACrosby


Here is a snippet for rearranging products (in stock come first):

<?php  /**  * Order product collections by stock status, instock products first.  */ class iWC_Orderby_Stock_Status {      public function __construct()     {         // Check if WooCommerce is active         if (in_array('woocommerce/woocommerce.php', apply_filters('active_plugins', get_option('active_plugins')))) {             add_filter('posts_clauses', array($this, 'order_by_stock_status'), 2000);         }     }      public function order_by_stock_status($posts_clauses)     {         global $wpdb;         // only change query on WooCommerce loops         if (is_woocommerce() && (is_shop() || is_product_category() || is_product_tag())) {             $posts_clauses['join'] .= " INNER JOIN $wpdb->postmeta istockstatus ON ($wpdb->posts.ID = istockstatus.post_id) ";             $posts_clauses['orderby'] = " istockstatus.meta_value ASC, " . $posts_clauses['orderby'];             $posts_clauses['where'] = " AND istockstatus.meta_key = '_stock_status' AND istockstatus.meta_value <> '' " . $posts_clauses['where'];         }         return $posts_clauses;     } }  new iWC_Orderby_Stock_Status;  ?> 

https://www.snip2code.com/Snippet/114858/WooCommerce-Products-Order-by-Stock-Stat

like image 26
Viktor Lavron Avatar answered Sep 20 '22 13:09

Viktor Lavron