Obtener la lista de productos de un ID de categoría dado

12

No pude encontrar la forma correcta de obtener la lista de todos los productos para una ID de categoría determinada (no el nombre de la categoría).

El código que estoy usando para obtener la lista de categorías es el siguiente, funciona bien:

$args = array(
           'orderby'    => $orderby,
           'order'      => $order,
           'hide_empty' => 0,
           'include'    => $ids,
           'parent'    => 0,
     ); 

$categories = get_terms( 'product_cat', $args );

Sin embargo, ahora para un ID de categoría dado (por ejemplo, 47), no pude encontrar la manera de obtener sus productos relevantes. Lo intenté de la siguiente manera:

$args = array( 
    'posts_per_page' => 5,
    'offset'=> 1,
    'category' => 47
 );

$products = get_posts( $args );
echo var_dump($products);

La depuración de la matriz $products devuelve siempre 0, lo cual es incorrecto, ya que sé que hay algunos productos en la categoría con ID 47. ¿Alguna idea de cómo arreglar mi código?

    
pregunta Malloc 06.05.2014 - 23:06

3 respuestas

16

Sospecho que el problema principal es que deberías usar el objeto WP_Query en lugar de get_posts() . De forma predeterminada, el último solo devuelve los elementos con un tipo de publicación de post no productos,

Por lo tanto, dada una categoría con ID 26, el siguiente código devolverá sus productos (WooCommerce 3+):

    $args = array(
    'post_type'             => 'product',
    'post_status'           => 'publish',
    'ignore_sticky_posts'   => 1,
    'posts_per_page'        => '12',
    'tax_query'             => array(
        array(
            'taxonomy'      => 'product_cat',
            'field' => 'term_id', //This is optional, as it defaults to 'term_id'
            'terms'         => 26,
            'operator'      => 'IN' // Possible values are 'IN', 'NOT IN', 'AND'.
        ),
        array(
            'taxonomy'      => 'product_visibility',
            'field'         => 'slug',
            'terms'         => 'exclude-from-catalog', // Possibly 'exclude-from-search' too
            'operator'      => 'NOT IN'
        )
    )
);
$products = new WP_Query($args);
var_dump($products);

En versiones anteriores de WooCommerce, la visibilidad se almacenaba como un metacampo, por lo que el código sería:

    $args = array(
    'post_type'             => 'product',
    'post_status'           => 'publish',
    'ignore_sticky_posts'   => 1,
    'posts_per_page'        => '12',
    'meta_query'            => array(
        array(
            'key'           => '_visibility',
            'value'         => array('catalog', 'visible'),
            'compare'       => 'IN'
        )
    ),
    'tax_query'             => array(
        array(
            'taxonomy'      => 'product_cat',
            'field' => 'term_id', //This is optional, as it defaults to 'term_id'
            'terms'         => 26,
            'operator'      => 'IN' // Possible values are 'IN', 'NOT IN', 'AND'.
        )
    )
);
$products = new WP_Query($args);
var_dump($products);

Aquí solo devolvemos productos visibles, 12 por página.

Eche un vistazo a enlace para obtener más detalles sobre cómo funciona la selección de categorías: a menudo es más útil recuperar por babosa que por ID!

    
respondido por el benz001 02.06.2014 - 12:53
2

cambiar categoría (nombre de categoría-slug) por id o nombre o slug

<?php

$args = array( 'post_type' => 'product', 'stock' => 1, 'posts_per_page' => 2,'product_cat' => 'category-slug-name', 'orderby' =>'date','order' => 'ASC' );
  $loop = new WP_Query( $args );
while ( $loop->have_posts() ) : $loop->the_post();
global $product; 
?>
Within loop we can fetch Product image, title, description, price etc. 

<?phpendwhile;wp_reset_query(); ?>
    
respondido por el dalveer 19.01.2015 - 13:21
2

Un poco tarde, pero me gustaría aclarar las cosas y proporcionar una respuesta más clara. El usuario @ benz001 dio una posible respuesta válida, pero dijo algo incorrecto: get_posts devuelve cualquier tipo de post-tipo, por defecto a posts post-type, como WP_Query . Las diferencias reales entre los dos se explican maravillosamente AQUÍ .

El hecho es que al OP simplemente le faltaban algunos parámetros en la matriz $args :

  • La definición del post-tipo que está buscando:

        'post_type'             => 'product',
    
  • Y la modificación de la "parte de taxonomía" de la consulta de búsqueda:

        'tax_query' => array(
            array(
                'taxonomy' => 'product_cat',
                'terms' => 26,
                'operator' => 'IN',
            )
        )
    

De esta manera tus próximas líneas

$products = new WP_Query($args);
var_dump($products);

Le mostrará los productos necesarios :)

Por supuesto, todos los demás parámetros adicionales que se muestran en @ benz001 son válidos, pero no los solicita el OP, por lo que decidí dejarlos atrás en esta respuesta.

    
respondido por el Erenor Paz 18.11.2016 - 12:22

Lea otras preguntas en las etiquetas