En otros tutoriales hemos visto la importancia de ordenar los productos en el catálogo o bien qué hacer con los productos agotados. Vamos a combinar ambos conceptos: Conseguir que los que no tengan stock salgan al final del listado.
Aspectos a tener en cuenta
Antes de ver la solución me gustaría que analices si es necesario hacer esto, lo recomiendo en los siguientes casos:
- Sueles tener muchos productos agotados y no te da tiempo a ordenarlos o eliminarlos.
- Los productos sin stock raramente los reponéis, por lo tanto no es necesario mostrarlo o pedir el mail para avisarles.
- Si te gusta dar una buena imagen y que el cliente vea siempre al principio productos de los que dispones.
Si es este tu caso o da igual y quieres hacerlo igualmente… Añadir este código a su functions.php de su child theme o más fácilmente a con el plugin Code Snippets.
Mostrar los productos sin stock al final
add_filter('posts_clauses', 'sin_stock_al_final_woocommerce');
function sin_stock_al_final_woocommerce($posts_clauses) {
global $wpdb;
// Solo cambiar la consulta en los bucles de WooCommerce
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;
}
Este código no altera nuestro orden manual, solo los muestra al final del cada categoría. Pasando de esto:
Y cuando aplicamos el snippet:
Ordenarlos por cantidad de inventario
Otra consulta común es cómo ordenar el catálogo por los productos que más inventario tienen(algo que no viene por defecto en WooCommerce) para ello usaremos el siguiente código:
add_filter( 'woocommerce_get_catalog_ordering_args', 'dl_orden_stock_woo', 9999 );
function dl_orden_stock_woo( $args ) {
$args['orderby'] = 'meta_value';
$args['order'] = 'ASC';
$args['meta_key'] = '_stock_status';
return $args;
}