Ordenar una tabla de productos WooCommerce: orden, columnas y ventas
La ordenación de una tabla de productos WooCommerce tiene tres partes: el orden con el que arranca la tabla, los encabezados de columna en los que pueden hacer clic los visitantes y una lista desplegable de ordenación opcional. Cada una se configura en un sitio distinto y lee sus datos de forma diferente, lo que explica la mayoría de las consultas sobre un "orden incorrecto": una columna de taxonomía sin flechas de ordenación, una columna calculada que no se puede ordenar, o más vendidos que no coinciden con las ventas reales. A continuación se explica cómo funciona cada parte en WOOT, cómo ordenar por tus propios campos y cómo desactivar la ordenación por columnas.
Tres formas de ordenar una tabla de productos WooCommerce
El orden predeterminado. En la pestaña Opciones de la tabla, Ordenar por defecto por (Default order by) define el campo por el que se ordena la tabla al cargarse, y Orden predeterminado (Default order) define la dirección, asc o desc. Las tablas nuevas empiezan por ID, en orden descendente. El shortcode puede sustituir ambos valores con los atributos orderby y order, usando las claves de campo de las columnas:
[woot id=12 orderby="menu_order" order="asc"]
[woot id=12 orderby="total_sales" order="desc"]
Otras claves son post_title, price, sku, stock_quantity, post_date y, para un campo de la pestaña Meta de la tabla, su clave meta. El atributo es orderby, en una sola palabra: order_by no se reconoce y se ignora sin avisar. Ten presente la dirección con Orden del menú (Menu order): el orden del menú va de menor a mayor, por lo que necesita asc, mientras que la dirección predeterminada de una tabla nueva es desc, lo que da la vuelta a la lista.
Encabezados de columna. Las columnas ordenables muestran dos pequeñas flechas en el encabezado. Un clic ordena por esa columna, el siguiente clic invierte la dirección y la tabla vuelve a la primera página.
La lista desplegable de ordenación (Sorting Dropdown). Activa Mostrar lista de ordenación (Show Sorting Dropdown) en Opciones y elige las entradas en Campos de la lista de ordenación (Sorting Dropdown Fields) (mantén pulsada una entrada y espera para reordenarla). La lista contiene las ordenaciones habituales de WooCommerce (popularidad, valoración media, más recientes, precio de menor a mayor y de mayor a menor) y además nombre, SKU, cantidad en stock, ventas totales, número de comentarios, fecha de última modificación, orden del menú, productos en oferta primero, disponibilidad, aleatorio e ID de producto. Cada campo de la pestaña Meta de la tabla se añade como Título: Ascendente (Title: Ascending) y Título: Descendente (Title: Descending). La primera entrada, Ordenado por la tabla (Sorted by table), vuelve a la ordenación de los encabezados. En un shortcode, indica las claves con el atributo orderby_select_fields, por ejemplo orderby_select_fields="popularity,price,price-desc,date". La lista desplegable está disponible en las tablas que cargan sus filas por AJAX, el modo normal de [woot].
Dos entradas de la lista no tienen dirección propia: Ordenar por más recientes (Sort by latest) y Ordenar por orden del menú (Sort by menu order) usan la dirección actual de la tabla. Con Orden predeterminado (Default order) en desc, "más recientes" muestra primero los productos más nuevos y "orden del menú" va al revés, así que añade solo la que corresponda a tu dirección predeterminada.
Qué columnas se pueden ordenar haciendo clic en el encabezado
Una columna es ordenable cuando sus datos son un campo de la entrada del producto o un único valor meta que la base de datos puede ordenar: ID, título, estado, fecha de publicación, fecha de modificación, número de comentarios, precio, precio normal y de oferta, SKU, peso y dimensiones, estado del stock, cantidad en stock, ventas totales, número de reseñas, valoración, orden del menú, y los campos de texto y numéricos de la pestaña Meta. El primer clic usa la dirección inicial propia de la columna: ID, fechas, número de comentarios y campos numéricos de la pestaña Meta empiezan por el valor más alto; título, precios, SKU, stock, ventas totales, valoraciones y orden del menú empiezan por el más bajo.
Las columnas de taxonomía (categorías, etiquetas, atributos como longitud o color) no se pueden ordenar. Un producto puede tener varios términos en una misma taxonomía, y la consulta de productos de WordPress no tiene forma de ordenar productos por los nombres de sus términos. Las columnas que se dibujan mediante código, como la miniatura, el botón de añadir al carrito o un valor modificado en un filtro, tampoco se pueden ordenar, porque la base de datos no contiene ese valor.
Los productos variables requieren una nota más. WooCommerce guarda un valor _price por cada precio de variación distinto, por lo que al ordenar por el encabezado Precio (Price) no se garantiza que un producto variable aparezca en su precio más bajo. En las tiendas con productos variables, ofrece Ordenar por precio: de menor a mayor (Sort by price: low to high) y Ordenar por precio: de mayor a menor (Sort by price: high to low) en la lista desplegable de ordenación: estas usan el precio más bajo y el más alto que calcula el propio WooCommerce para cada producto.
Ordenar por un campo personalizado o un valor calculado
Para ordenar por cualquier campo personalizado, añádelo en la pestaña Meta con su clave meta exacta y el tipo texto (text) (alfabético) o número (number) (numérico), y después añádelo como columna. Al ordenar por una clave meta solo se muestran los productos que tienen un valor para esa clave, que es como WordPress construye la consulta; esta pregunta frecuente explica cómo incluir los demás.
Un valor que calculas en el hook woot_meta_data_cell es solo de visualización: el hook cambia el texto de la celda después de cargar los productos, por lo que la ordenación sigue usando lo que esté guardado bajo esa clave meta, y si no hay nada guardado, no hay nada que ordenar. La solución es guardar el valor calculado como meta real del producto y ordenar por él. Ejemplo: un valor de inventario (precio × cantidad en stock) que se mantiene actualizado cuando se guarda un producto y cuando su stock cambia después de un pedido.
/*
* Store "stock value" (price x stock quantity) as product meta _stock_value,
* so a WOOT Meta field with this key and the type "number" can be sorted.
* Child theme functions.php or a code snippets plugin.
*/
function my_store_stock_value($product) {
if (!is_a($product, 'WC_Product')) {
$product = wc_get_product($product);
}
if (!$product) {
return;
}
$value = (float) $product->get_price() * (int) $product->get_stock_quantity();
update_post_meta($product->get_id(), '_stock_value', round($value, 2));
}
add_action('woocommerce_new_product', 'my_store_stock_value');
add_action('woocommerce_update_product', 'my_store_stock_value');
add_action('woocommerce_product_set_stock', 'my_store_stock_value');
Los productos existentes reciben el valor la próxima vez que se guarden. Para rellenarlo en todos a la vez, selecciónalos en Productos, elige Editar en Acciones en lote, haz clic en Aplicar y después en Actualizar sin cambiar ningún campo. El mismo método permite ordenar por una taxonomía: dentro de la función, lee el término con wp_get_post_terms() y guarda su nombre o número en una clave meta.
Ventas totales y popularidad: el mismo número desde dos lugares
La columna Ventas totales (Total sales), Ordenar por defecto por (Default order by) → Ventas totales (Total sales) y las entradas Ventas totales: Ascendente/Descendente (Total Sales: Ascending/Descending) de la lista desplegable ordenan por el campo meta de producto total_sales (las entradas de la lista desplegable además excluyen los productos agrupados y externos). Ordenar por popularidad (Sort by popularity) usa la tabla de búsqueda de productos de WooCommerce, la misma ordenación que la página de la tienda: total_sales de mayor a menor y, después, los ID de producto más recientes primero. Normalmente ambos contienen el mismo número.
WooCommerce incrementa total_sales cuando un pedido pasa a Procesando, En espera o Completado. El historial de ventas que se importó, o los pedidos creados sin estos cambios de estado, nunca llegan a ese campo, por lo que los "más vendidos" reflejan únicamente las ventas realizadas desde entonces. Para ordenar según el historial completo, escribe los totales en total_sales (la mayoría de las herramientas de importación pueden asignar este campo) y ejecuta WooCommerce → Estado → Herramientas → Tablas de búsqueda de productos → Regenerar, para que la popularidad use los mismos números. Para una tabla fija de más vendidos, consulta tablas con los productos más vendidos.
Desactivar la ordenación por columnas
En una tabla creada en WOOT → Tablas, selecciona las columnas en Desactivar orden por columnas (Disable columns order-by) en la pestaña Opciones. Sus flechas desaparecen y los encabezados dejan de ser clicables; el orden predeterminado se sigue aplicando.
Los shortcodes [woot_upsells], [woot_cross_sells], [woot_related], [woot_grouped] y [woot_variations] no están vinculados a una tabla, por lo que no tienen esa opción ni un atributo para ello. Este código desactiva la ordenación por encabezado solo en esas tablas:
/*
* WOOT: no header sorting in the upsells, cross-sells, related,
* grouped and variations tables. Other tables keep their sorting.
* Child theme functions.php or a code snippets plugin.
*/
add_filter('woot_profile_extend', function ($profile, $action, $shortcode_args = []) {
$no_sorting = ['woot_upsells', 'woot_cross_sells', 'woot_related', 'woot_grouped', 'woot_variations'];
if (isset($shortcode_args['filter_provider']) && in_array($shortcode_args['filter_provider'], $no_sorting, true)) {
foreach ($profile as $key => $field) {
if (is_array($field) && !empty($field['order'])) {
$profile[$key]['order'] = false;
}
}
}
return $profile;
}, 10, 3);
Quita de la lista $no_sorting los shortcodes que quieras mantener ordenables. La tabla también repite los títulos de las columnas en una fila de pie. No hay ninguna opción para ello; ocúltala con CSS. En la pestaña CSS personalizado de la tabla (el plugin limita las reglas a esa tabla):
table tfoot { display: none; }
Para todas las tablas del sitio, pon esto en su lugar en Apariencia → Personalizar → CSS adicional:
.woot-data-table table tfoot { display: none; }
Ordenar las tablas de ventas dirigidas, ventas cruzadas y productos relacionados
Estos shortcodes ordenan por título de producto, de la A a la Z, salvo que establezcas orderby y order:
[woot_upsells columns="thumbnail,sku,title,price" orderby="menu_order"]
[woot_upsells columns="thumbnail,sku,title,price" orderby="post__in"]
menu_order usa el orden del menú de los productos (arrastrar y soltar en la vista Ordenación (Sorting) de la lista de Productos, o el campo Orden del menú en la pestaña Avanzado del producto). post__in mantiene el orden en el que se guardan los productos en el campo Ventas dirigidas o Ventas cruzadas del producto, o como hijos de un producto agrupado. WooCommerce elige los productos relacionados al azar, así que para ellos usa un campo: orderby="menu_order", o orderby="total_sales" order="desc" para mostrar primero los más vendidos (la dirección de estas tablas es asc salvo que la establezcas). Estas tablas cargan todas sus filas de una vez, y un clic en el encabezado reordena las filas cargadas en el navegador según el contenido de las celdas. Eso funciona con valores simples como el SKU o el stock, pero los precios y los títulos con enlace se comparan como texto, lo que es un motivo más para desactivar la ordenación por encabezado en estas tablas con el código anterior.
Los shortcodes encuentran el producto a partir de la página en la que están. Si se usan en otro lugar (una página normal, una pestaña creada mediante código, un PDF generado por otro plugin), muestran WOOT: Set product id please in the shortcode attribute!. Indica el ID del producto: [woot_upsells id=123]. La página de [woot_upsells] enumera el resto de atributos.
Si el orden sigue siendo incorrecto
- Revisa el shortcode: un atributo
orderbyuordersustituye a las Opciones de la tabla. - Revisa la dirección: Orden predeterminado (Default order) se aplica a todos los campos, incluido el orden del menú.
- Con un campo meta, confirma que los productos tienen un valor bajo esa clave exacta; los productos que no lo tienen no se muestran mientras se ordena por ella.
- Con los más vendidos, compara el valor de
total_salesde dos productos con sus ventas reales y regenera las tablas de búsqueda de productos después de corregirlo. - Vacía la caché de la página después de cambiar las Opciones y vuelve a cargar la página sin haber iniciado sesión.
Si una columna sigue ordenándose de una forma que no puedes explicar, abre un tema en el foro de soporte de WOOT con el shortcode de la tabla, la columna y dos productos que aparezcan en el orden equivocado.