En la página de tienda que se crea con WooCommerce aparece por defecto un selector de orden, en el que el visitante puede elegir en qué orden visualizar los productos, en el que de manera predeterminada la clasificación es bastante aleatoria, o lo que se conoce como por orden en el menú, de lo que ya hablamos en otro artículo.
¿Y si, por ejemplo, queremos que se muestren primero nuestros productos destacados? Sí, esos que marcamos como destacados por algo al crearlos.
Porque da igual que los marquemos así, ni el cliente encontrará una opción en el desplegable para mostrarlos, pero lo que es más importante, por defecto no podemos elegir mostrar primero los productos destacados.
Y, en consecuencia, nuestros productos destacados quedarán, por ahí, huérfanos, sin nadie que les reconozca ese valor, ese mérito de ser destacados 🙁
Entonces ¿qué hago?, ¿no puedo mostrar en la tienda primero mis productos destacados?
¡Que síííííí!
Para conseguirlo, eso sí, tenemos que valernos de una función que haga la magia por nosotros, de manera automática, sin intervención del usuario, esta:
/* Ordenar productos en tienda por defecto primero por destacados */
// Reemplazamos el orden por defecto con uno personalizado
add_filter( 'woocommerce_catalog_orderby', 'ayudawp_orden_catalogo_personalizado' );
function ayudawp_orden_catalogo_personalizado( $sortby ) {
$sortby['featured'] = __( 'Orden por defecto', 'woocommerce' );
unset( $sortby['menu_order'] );
return $sortby;
}
// Hacemos que nuestro orden personalizado sea el por defecto
add_filter( 'woocommerce_default_catalog_orderby', 'ayudawp_orden_catalogo_personalizado_pordefecto' );
function ayudawp_orden_catalogo_personalizado_pordefecto() {
return 'featured';
}
// Definimos el orden como opcion
add_filter( 'woocommerce_get_catalog_ordering_args', 'ayudawp_opciones_orden_catalog_personalizado' );
function ayudawp_opciones_orden_catalog_personalizado( $args ) {
$orderby_value = isset( $_GET['orderby'] ) ? wc_clean( $_GET['orderby'] ) : apply_filters( 'woocommerce_default_catalog_orderby', get_option( 'woocommerce_default_catalog_orderby' ) );
if ( 'featured' == $orderby_value ) {
$args['orderby'] = 'menu_order title';
$args['order'] = '';
$args['meta_key'] = '';
}
return $args;
}
// Ajustamos el orden para permitir destacados
add_filter( 'posts_orderby', 'ayudawp_orden_catalogo_personalizado_destacados_primero', 10, 2 );
function ayudawp_orden_catalogo_personalizado_destacados_primero( $order_by, $query ) {
global $wpdb;
if ( ! is_admin() ) {
$orderby_value = ( isset( $_GET['orderby'] ) ? wc_clean( (string) $_GET['orderby'] ) : apply_filters( 'woocommerce_default_catalog_orderby', get_option( 'woocommerce_default_catalog_orderby' ) ) );
$orderby_value_array = explode( '-', $orderby_value );
$orderby = esc_attr( $orderby_value_array[0] );
$order = ( ! empty( $orderby_value_array[1] ) ? $orderby_value_array[1] : 'ASC' );
$featured_product_ids = wc_get_featured_product_ids();
if ( $orderby == "featured" && is_array( $featured_product_ids ) && ! empty( $featured_product_ids ) ) {
if ( empty( $order_by ) ) {
$order_by = "FIELD(" . $wpdb->posts . ".ID,'" . implode( "','", $featured_product_ids ) . "') DESC ";
} else {
$order_by = "FIELD(" . $wpdb->posts . ".ID,'" . implode( "','", $featured_product_ids ) . "') DESC, " . $order_by;
}
}
}
return $order_by;
}
Solo tienes que copiar y pegar este código de arriba en el archivo functions.php del tema activo – o como prefieras – y ya tendrás el orden por defecto del catálogo de tu tienda mostrando primero los productos destacados.
Otra posibilidad es que, por defecto, y siempre, los productos destacados salgan los primeros en la tienda, algo que consigues con este sencillo código:
/* Productos destacados primeros por defecto */
add_filter( 'posts_orderby', 'ayudawp_productos_destacados_primero', 9999, 2 );
function ayudawp_productos_destacados_primero( $order_by, $query ) {
global $wpdb;
if ( ! is_admin() && $query->is_main_query() && is_woocommerce() ) {
$sticky_product_ids = wc_get_featured_product_ids();
$order_by = "FIELD(" . $wpdb->posts . ".ID,'" . implode( "','", $sticky_product_ids ) . "') DESC, " . $order_by;
}
return $order_by;
}
¡A vender!
¿Te gustó este artículo? ¡Ni te imaginas lo que te estás perdiendo en YouTube!











Hola,
¿Crees que el código funcionaría también en una web multilingüe con el plugin Polylang PRO para Woocommerce?
Gracias!
No tiene por qué no funcionar, son funciones estándar de WooCommerce
Hola Fernando gracias por tus tutoriales, se podría hacer para que en vez de productos individuales fueran categorías es decir te creas la categoría navidad y esa es la que quieres que aparezcan los productos que hay en ella en primer lugar y así sucesivamente conforme las ordenes, saludos y muchas gracias.