Paginación y conteo de resultados en Woocommerce después de un loop personalizado

18 may 2018, 22:17:11
Vistas: 13.9K
Votos: 1

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.

6
Comentarios

Lo siento, pero tu código no tiene ningún sentido... No hay razón para esta parte: $wp_query = NULL; $wp_query = $loop;. ¿Por qué asignar NULL si vas a asignar otro valor justo después? Y ¿por qué asignar algo a wp_query si justo después usas $loop para iterar tus posts...

Krzysiek Dróżdż Krzysiek Dróżdż
24 may 2018 01:18:17

Hice esas cosas siguiendo la guía. Según mi entendimiento, poner a cero la consulta principal debe eliminar errores potenciales al sobrescribir. Luego, el propósito de asignar mi $loop a wp_query es para que funcione la paginación. Mi bucle muestra posts pero no afecta la consulta original que es responsable de la paginación y el conteo de resultados. Vi este tipo de código funcionando en la guía (enlace proporcionado en la pregunta anterior), pero mi caso es ligeramente diferente porque estoy usando WooCommerce en lugar de WordPress plano.

Bartosz Was Bartosz Was
24 may 2018 15:17:31

No tiene ningún sentido. Si asignas un valor a una variable, simplemente lo asignas, no hay razón para hacerlo dos veces. Y si no modificas el global $wp_query, entonces no hay motivo para almacenarlo en variables temporales ni nada por el estilo. Cambia el tutorial, porque este es realmente malo: el autor no entiende lo básico de PHP ni de WP. PD: WooCommerce y otros plugins de terceros están fuera de tema en este sitio.

Krzysiek Dróżdż Krzysiek Dróżdż
24 may 2018 15:26:03

¿Qué objeto? Tú creas este bucle por tu cuenta en tu código...

Krzysiek Dróżdż Krzysiek Dróżdż
24 may 2018 15:30:38

Simplificando mi declaración: $woocommerce_loop está obteniendo sus resultados de algún lugar. Pensé que era de wp_query (como en WordPress) pero parece que está tomando sus resultados de otro objeto y estoy tratando de descubrir exactamente cuál es ese objeto.

Bartosz Was Bartosz Was
24 may 2018 15:41:15

Sí, lo hice. Olvidé cambiar la línea con las variables globales, así que no estaba claro que estoy usando 2 objetos globales aquí: $loop y $wp_query... Me encantaría cambiar la guía pero no hay ejemplos de WooCommerce que pueda usar. En cualquier caso, WooCommerce tiene algún objeto que es responsable de obtener los valores de $woocommerce_loop (supongo que es el bucle principal de WooCommerce). En WordPress ese objeto era 'wp_query' pero en WooCommerce valores similares se asignan a una $key diferente. Solo quiero descubrir esa clave.

Bartosz Was Bartosz Was
24 may 2018 15:41:17
Mostrar los 1 comentarios restantes
Todas las respuestas a la pregunta 1
14

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/

24 may 2018 22:05:06
Comentarios

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.?

Bartosz Was Bartosz Was
25 may 2018 16:58:45

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

cfx cfx
25 may 2018 20:45:15

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

Bartosz Was Bartosz Was
29 may 2018 14:38:51

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.

cfx cfx
29 may 2018 20:14:22

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...

Bartosz Was Bartosz Was
29 may 2018 23:07:21

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.

cfx cfx
29 may 2018 23:27:20

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.

Bartosz Was Bartosz Was
29 may 2018 23:33:14

¿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?

cfx cfx
29 may 2018 23:37:49

Por supuesto, echa un vistazo a #EDIT2.

Bartosz Was Bartosz Was
30 may 2018 00:04:48

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.

cfx cfx
30 may 2018 01:14:12

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.

Bartosz Was Bartosz Was
30 may 2018 01:27:45

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)

Bartosz Was Bartosz Was
30 may 2018 02:03:05

...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...

Able Able
20 nov 2018 17:58:29

@Able funciona perfectamente. Si pegas un Gist con todo el código de tu plantilla, intentaré ver por qué puede que no esté funcionando para ti.

cfx cfx
20 nov 2018 21:09:32
Mostrar los 9 comentarios restantes