Por defecto en WooCommerce, podemos ordenar productos por precio, popularidad, reviews y orden alfabético. Por lo que no podemos ordenarlos por disponibilidad, es decir, mostrar los productos con más cantidad de inventario primero y al final los que tienen existencias cero.
En un tutorial anterior enseñé a poner por defecto que los productos agotados saliesen al final del catálogo. Pero esto solo hacía que se pusiesen al final y sin ningún control para el usuario. Además ambos códigos son incompatibles, usas este o el que te voy a explicar.
En este caso lo que vamos a hacer, es que sea opcional para el cliente ordenarlos por cantidad:

Para conseguir mostrar en el filtro de la tienda y categorías esta opción de filtrar por cantidad, deberemos añadir este código al functions.php de nuestro Child Theme o bien en nuestro plugin de funcionalidades como explico aquí.
// Ordering products based on the selected values
function filter_woocommerce_get_catalog_ordering_args( $args, $orderby, $order ) {
switch( $orderby ) {
case 'availability':
$args['orderby'] = 'meta_value_num';
$args['order'] = 'DESC';
$args['meta_key'] = '_stock';
break;
}
return $args;
}
add_filter( 'woocommerce_get_catalog_ordering_args', 'filter_woocommerce_get_catalog_ordering_args', 10, 3 );
// Orderby setting
function filter_orderby( $orderby ) {
$orderby['availability'] = __( 'Cantidad de inventario', 'woocommerce' );
return $orderby;
}
add_filter( 'woocommerce_default_catalog_orderby_options', 'filter_orderby', 10, 1 );
add_filter( 'woocommerce_catalog_orderby', 'filter_orderby', 10, 1 );
// Optional: use for debug purposes (display stock quantity)
function action_woocommerce_after_shop_loop_item() {
global $product;
echo '<div style="color: red !important; font-size: 20px !important;">' . wc_get_stock_html( $product ) . '</div>';
}
add_action( 'woocommerce_after_shop_loop_item', 'action_woocommerce_after_shop_loop_item', 9, 0 );
Con este snippet será de mayor a menor, si lo quieres mostrar de menor a mayor cambia el atributo order por:
$args 'order' = 'asc'
Espero que os haya servido y cualquier duda como siempre os leo en comentarios!
Deja una respuesta