Paginación y conteo de resultados en Woocommerce después de un loop personalizado
Estoy intentando mostrar correctamente la paginación y el conteo de resultados después de ejecutar mi consulta personalizada.
Actualmente los resultados de la consulta se muestran correctamente, pero parece que el conteo de resultados y la paginación se muestran para todos los productos en la tienda.
Después de investigar el problema, descubrí que creé un objeto de consulta separado en lugar de reemplazar la consulta principal. Intenté solucionarlo siguiendo esta guía: ¿Cómo arreglar la paginación para loops personalizados?
... pero esto es para WordPress general y necesito adaptarlo para Woocommerce:
global $loop;
$args = array(
'post_type' => 'product',
'posts_per_page' => $per_page,
'meta_query' => array(
array(
'key' => '_product_brand',
'value' => $val,
)
)
);
$loop = new WP_Query($args);
// Corrección de paginación
$temp_query = $wp_query;
$wp_query = NULL;
$wp_query = $loop;
if ($loop->have_posts()) {
while ($loop->have_posts()) : $loop->the_post();
wc_get_template_part('content', 'product');
endwhile;
} else {
echo __('No se encontraron productos');
}
wp_reset_postdata();
$wp_query = NULL;
$wp_query = $temp_query;
... a una función de Woocommerce. Hasta ahora he intentado cambiar la variable global $loop por $woocommerce_loop pero produce errores.
También intenté pasar el atributo $paged así:
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args = array(
'post_type' => 'product',
'posts_per_page' => $per_page,
'paged' => $paged,
'meta_query' => array(
array(
'key' => '_product_brand',
'value' => $val,
)
)
);
y también así:
$args['paged'] = (get_query_var('paged')) ? get_query_var('paged') : 1;
Ambos métodos fallaron, muestran correctamente los productos pero no la paginación ni el conteo de resultados.
¿Cuál es el problema aquí? Agradecería mucho cualquier ayuda, gracias.
#EDIT 1 Después de seguir la guía de CFX: https://cfxdesign.com/create-a-custom-woocommerce-product-loop-the-right-way/
La paginación y el conteo de resultados finalmente comenzaron a funcionar. Mi problema aquí era usar WP_Query en lugar de wc_get_products.
Siguiendo la documentación de Woocommerce para la función wc_get_products: https://github.com/woocommerce/woocommerce/wiki/wc_get_products-and-WC_Product_Query
Logré mostrar correctamente los productos con mi clave personalizada. Pero no todos los argumentos de la documentación funcionan para mí. Por ejemplo, no puedo mostrar productos de una categoría específica ni productos con un precio determinado.
$all_products = wc_get_products(array(
'category' => array('suspension'),
'price' => 59.99,
'regular_price' => 59,
'sale_price' => 159,
));
Intenté pasar estos argumentos uno por uno, todo según la documentación, por lo que debería funcionar pero no es así. Está produciendo este error:
Warning: array_map(): Argument #2 should be an array in E:\xampp\apps\wordpress\htdocs\wp-content\plugins\woocommerce\includes\data-stores\class-wc-product-data-store-cpt.php on line 1673
Warning: array_filter() expects parameter 1 to be array, null given in E:\xampp\apps\wordpress\htdocs\wp-content\plugins\woocommerce\includes\data-stores\class-wc-product-data-store-cpt.php on line 1673
#EDIT2
argumentos:
$all_products = wc_get_products(array(
'product_category' => 'suspension',
));
manejador:
if (!empty($query_vars['product_category'])) {
$query['tax_query'][] = array(
'taxonomy' => 'product_cat',
'terms' => esc_attr($query_vars['product_category']),
);
return $query;
}
Quiero mostrar productos de una categoría padre con un slug determinado. Este código solo funciona si paso el ID de la categoría. Si paso el slug como argumento (como en el código anterior), el loop muestra todos los productos de la tienda.

Estás complicando bastante las cosas con parte de tu sintaxis de consulta, y WooCommerce en realidad desaconseja el uso de WP_Query()
para recuperar productos. Incluso afirman que podría terminar rompiéndose en el futuro.
Recientemente escribí un artículo sobre cómo hacer lo que necesitas, con un ejemplo completo aquí: https://cfxdesign.com/create-a-custom-woocommerce-product-loop-the-right-way/

Sí, eso es exactamente lo que estaba buscando. ¡Gracias! Ahora tengo que transformar todas las WP_Queries en wc_get_products. Así que tengo una pregunta para ti: ¿usaste consultas complejas en tu proyecto? Me refiero a aquellas con meta_key especificado, meta_value, rango de precios entre valores dados, etc.?

No lo he intentado, pero podría funcionar. Pruébalo y haré todo lo posible por ayudarte si te encuentras con algún problema.

Actualicé la publicación. ¿Puedes revisar #EDIT1 y decirme si esos argumentos están funcionando para ti?

No están funcionando, pero si los formateo como lo harías con un WP_Query()
, entonces la consulta de taxonomía funciona bien. No estoy seguro de lo que intentas hacer con los valores de precio, pero quizás necesites una clave personalizada meta_query
para lograr lo que quieres. Revisa la clase WC_Product_Query()
para ver los argumentos válidos.

Es extraño, los argumentos principales no funcionan. Parece que necesito informar al soporte de WooCommerce. Sí, resolví el tema de precios con meta_query
. Para tu información, estoy usando precios con mis filtros personalizados: el usuario pasa 'price_min' y 'price_max' y luego muestro productos dentro del rango de precio dado. Ahora me pregunto cómo resolver el problema de categorías. Para categorías con ID dado usé tax_query, pero ¿qué pasa con categorías con slug dado? Para ellas, el argumento category
no funciona...

category
es estrictamente para la taxonomía nativa de WordPress category
. Si te refieres a filtrar por product_cat
, entonces necesitarás un tax_query
, que confirmo que funciona como se espera. Quizás quieras publicar tu solución completa como una actualización.

tax_query
funciona como se espera, pero solo puedo pasar el ID de la categoría padre, y necesito pasar el slug de la categoría padre como argumento. Definitivamente haré una actualización para los lectores futuros.

¿Podrías actualizar con el código actual que tienes y detalles sobre lo que esperas que suceda e información sobre lo que está ocurriendo en su lugar?

No está claro lo que estás intentando hacer aquí. Por favor incluye el código completo. Si se trata de una plantilla de página, inclúyela. No tengo idea de por qué dividiste esto en "argumentos" y "manejador" o qué se supone que significan.

Como el argumento category
no funciona, estoy intentando encontrar otra forma de mostrar todos los productos de una categoría dada. Así que quiero pasar el slug de la categoría como argumento.

Encontré cómo mostrar productos de una categoría usando el ID de la categoría padre y lo logré usando tax_query
. Ahora me pregunto si es posible configurar tax_query
para poder pasar el slug
de la categoría en lugar del ID. || product_category
no es un argumento incorporado, por lo que WooCommerce lo trata como personalizado, y los argumentos personalizados deben manejarse manualmente, exactamente como los meta_keys personalizados (consulta la documentación)

...pero ¿qué pasa con el result count
? parece que no muestra el recuento correcto de productos que obtuvimos usando el enfoque @cfx. Según lo que entendí, $total
(woocommerce_result_count()
) se toma de wc_get_loop_prop( 'total' )
, y veo que lo cambiamos a $products->total
y solo entonces hicimos do_action('woocommerce_before_shop_loop');
Pero $total en Mostrando x - x de x resultados
no reacciona a esto...
