Hace un par de días explicaba en un vídeo cómo quitar el menú Ordenar por de WooCommerce. Pero ocurre que a veces no quieres eliminarlo, sino que lo que quieres es quitarle alguna de las opciones que trae porque no te resultan de utilidad. En una palabra, personalizar el desplegable Ordenar por de WooCommerce.
En esta entrada veremos cómo hacerlo mediante código. Si prefieres utilizar un plugin (que siempre es más rápido y sencillo) puedes echarle un ojo a éste.
Tabla de contenidos
Por defecto, el menú trae las siguientes opciones:
- Orden predeterminado
- Ordenar por popularidad
- Ordenar por puntuación
- Ordenar por novedades
- Ordenar por precio: bajo a alto
- Ordenar por precio: alto a bajo
Son opciones que, en términos generales, no están mal. Precisamente por eso las lleva, son un poco útiles para gran parte de las tiendas. Pero en ocasiones, dependiendo del comercio electrónico de que se trate, algunas de ellas son poco (o nada) útiles.
Sin embargo suele echarse de menos alguna que otra opción en ese menú (o en los ajustes de configuración), por ejemplo para mostrar en primer lugar los productos destacados. Afortunadamente esa carencia puede suplirse con este plugin:
Vamos a ver entonces cómo cambiar opciones de ese menú. De hecho, vamos a aprender a quitar una o varias de ellas.
La función woocommerce_catalog_ordering
La función que genera ese menú desplegable es woocommerce_catalog_ordering, que está en el archivo /woocommerce/includes/wp-template-functions.php. El código que nos interesa es éste:
function woocommerce_catalog_ordering() {
global $wp_query;
if ( 1 === $wp_query->found_posts || ! woocommerce_products_will_display() ) {
return;
}
$orderby = isset( $_GET['orderby'] ) ? wc_clean( $_GET['orderby'] ) : apply_filters( 'woocommerce_default_catalog_orderby', get_option( 'woocommerce_default_catalog_orderby' ) );
$show_default_orderby = 'menu_order' === apply_filters( 'woocommerce_default_catalog_orderby', get_option( 'woocommerce_default_catalog_orderby' ) );
$catalog_orderby_options = apply_filters( 'woocommerce_catalog_orderby', array(
'menu_order' => __( 'Default sorting', 'woocommerce' ),
'popularity' => __( 'Sort by popularity', 'woocommerce' ),
'rating' => __( 'Sort by average rating', 'woocommerce' ),
'date' => __( 'Sort by newness', 'woocommerce' ),
'price' => __( 'Sort by price: low to high', 'woocommerce' ),
'price-desc' => __( 'Sort by price: high to low', 'woocommerce' )
) );
if ( ! $show_default_orderby ) {
unset( $catalog_orderby_options['menu_order'] );
}
if ( 'no' === get_option( 'woocommerce_enable_review_rating' ) ) {
unset( $catalog_orderby_options['rating'] );
}
wc_get_template( 'loop/orderby.php', array( 'catalog_orderby_options' => $catalog_orderby_options, 'orderby' => $orderby, 'show_default_orderby' => $show_default_orderby ) );
}
Si te fijas un poco, ahí puedes ver el array $catalog_orderby_options, que incluye las opciones que muestra ese menú. Bien, nos vamos acercando.
En fin, como no todo el mundo es capaz de «leer» código PHP, te traduzco lo importante: todas estas opciones acaban en una variable llamada $orderby. No, tranquilo, no me voy a poner técnico.
En realidad ya hemos llegado al meollo del asunto: actuando sobre esa variable podemos hacer lo que queramos con las opciones de ese menú.
Bueno, pues entonces ya lo tenemos. Un poco de código será suficiente. Pero no te preocupes, que te lo voy a dar perfectamente preparado y listo para usar.
¿Estás construyendo tu tienda online o eres implementador WordPress?
¿Necesitas plugins de calidad y con soporte para implementar funcionalidades concretas?
Consigue todos los plugins a la venta en la sección de plugins de esta web y todos los que siga añadiendo. Acceso a los 96 plugins (y subiendo) con soporte directo del desarrollador, actualizaciones y uso ilimitado: úsalos en tantas webs como lo necesites.
Se trata, simplemente, de hacer un unset («desregistrar») a cada uno de los métodos de ordenamiento que queramos quitar del menú. Las correspondencias por nombres son las siguientes:
- Orden predeterminado: menu_order
- Ordenar por popularidad: popularity
- Ordenar por puntuación: rating
- Ordenar por novedades: date
- Ordenar por precio (bajo a alto): price
- Ordenar por precio (alto a bajo): price-desc
Así, si por ejemplo no quieres que aparezca la opción de ordenar por puntuación porque aún no tienes muchas valoraciones en tu tienda, tendrás que usar el siguiente código:
function ejr_personalizar_menu_ordenar ($orderby) {
unset ($orderby ["rating"]);
return $orderby;
}
add_filter ("woocommerce_catalog_orderby", "ejr_personalizar_menu_ordenar", 20);
Si, por ejemplo, quisieras quitar las opciones de ordenar por precio, tendrías que poner dos unset, uno por cada una de las opciones que quieres quitar. Así:
function ejr_personalizar_menu_ordenar ($orderby) {
unset ($orderby ["price"]);
unset ($orderby ["price-desc"]);
return $orderby;
}
add_filter ("woocommerce_catalog_orderby", "ejr_personalizar_menu_ordenar", 20);
¿Y si sólo quieres dejar las opciones de orden predeterminado y por fecha (novedades)? Fácil, tendrías que poner algo así:
function ejr_personalizar_menu_ordenar ($orderby) {
unset ($orderby ["popularity"]);
unset ($orderby ["rating"]);
unset ($orderby ["price"]);
unset ($orderby ["price-desc"]);
return $orderby;
}
add_filter ("woocommerce_catalog_orderby", "ejr_personalizar_menu_ordenar", 20);
¿A que es fácil? A lo mejor te preguntas qué pasaría si te lías a quitar cosas y acabas quitando todas las opciones. Pues no, el menú no desaparece, sino que sale esta especie de engendro:
Menú «Ordenar por» sin opciones
Que no es ni más ni menos que un menú desplegable vacío, sin opciones. Si lo que quieres es que desaparezca el menú echa un vistazo al vídeo donde explico cómo se hace.
Dónde poner ese código
Llevamos un rato hablando de poner tal o cual código, y tú a lo mejor te estás diciendo: Sí, todo eso ya lo tengo claro, pero ¿dónde narices tengo que poner ese código?
Si es así te diré que tienes más de una opción (incluso más de dos), y que no todas son igual de correctas o de aconsejables.
Te remito a este artículo en el que te explico con detalle dónde y cómo poner tus códigos personalizados. Ya sabes, las cosas bien hechas siempre funcionan mejor a la larga. Y si se trata de un sitio web que te genera ingresos, hay que hacer las cosas lo mejor posible.
Conclusión
Como ves, es muy sencillo. Ahora no sólo sabes cómo eliminar el menú por completo, sino que también sabes ya cómo quitar sólo alguna de las opciones.
Si tienes cualquier duda o problema para implementarlo, o cualquier otra cuestión acerca de WordPress o de WooCommerce, ya sabes que estoy a tu disposición tanto en los comentarios como a través del formulario de contacto.
Ecamisetas dice
Buenas tardes, tengo puesto el orden de precio más bajo al más alto. El problema es que el precio que tengo que se muestre es el precio de 1000 unidades. Ese precio está en la variable $precio_final. Sería posible ordenarlos por precio de menor a mayor pero con los datos de la variable? no se si me comprende.
Un saludo, muchas gracias
Enrique J. Ros dice
Hola Ecamisetas
Esos datos se cogen directamente de la base de datos, si quieres ordenarlo según otro criterio tendrás que añadir ese dato como custom field del producto y filtrar la query en función del contenido de ese custom field.
Un saludo,
Ecamisetas dice
Buenos días, gracias por su respuesta.
Comprendo lo que me dice pero no se si sabré ponerlo bien.
En el archivo woocomerce/content-product.php tengo una función con cálculos ahí que en resumen el resultado del precio de 1000 me lo recoge en la variable $precio_final.
Me puede dar alguna idea de que tengo que hacer? es decir, he de crear en wc-template-function.php en la función woocommerce_catalog_ordering() añadir esa opción?,
O crear una función nueva en functions.php que ordene por $precio final?
Es posible modificar la opción de ‘price-desc’ => __( ‘Sort by price: high to low’, ‘woocommerce’ ), para que sea demi forma?
O la única forma de hacerlo es añadiendo a cada producto el custom field con ese precio? tengo 5000 productos.
**************** es mi web para que vea lo que le digo.
Un saludo y muchas gracias.
Enrique J. Ros dice
Hola de nuevo Ecamisetas
Sí, la idea ya te la daba en el mensaje anterior: tendrás que coger ese dato y meterlo en la base de datos asociado al producto y a partir de ahí modificar la query (seguramente puedas usar pre_get_posts) para ordenar los productos.
Un saludo
Olatz dice
Buenas tardes
He probado tu codigo, pero no sé si es por mi theme, pero no funciona 🙁 Tengo Generate Press, y he añadido el código con pluginception. Un saludo y gracias!
Francisco Gutiérrez dice
He creado otra página customizada para la tienda de mi web, sin embargo, el desplegable no se muestra y quiero que aparezca pues las opciones de ordenar me sirven y no quisiera añadir más plugins.
¿Cómo consigo añadir ese desplegable para ordenar los productos en mi nueva página de tienda?
Un saludo.
Lorena dice
Hola Enrique,
me gustaría saber como crear un desplegable como el de «ordenar por» pero con filtros. Es decir crear un desplegable de «Filtrar por» para que el cliente pueda elegir el tipo de filtro que quiere usar, por ejemplo, por categorías, por colores, por precio. Vamos que los filtros estén ocultos y se desplieguen al abrir el desplegable. Si existe algún plugin que lo haga sería genial. Mi tema funciona con woocommerce.
Gracias de antemano, un saludo.