Obtenga la lista de productos de una ID de categoría determinada

14

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 una ID de categoría determinada (digamos 47), no pude encontrar la forma de obtener sus productos relevantes. Traté 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 $productsmatriz siempre devuelve 0, lo cual es incorrecto, ya que sé que hay algunos productos en la categoría con ID 47. ¿Alguna idea de cómo solucionar mi código?

Malloc
fuente
1
categoryo product_category?
fuxia

Respuestas:

19

Sospecho que el problema principal es que debería usar el WP_Queryobjeto en lugar de hacerlo get_posts(). La última opción por defecto solo devuelve elementos con un post_type de postno productos,

Entonces, dada una categoría con ID 26, el siguiente código devolvería 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 http://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters para obtener más detalles sobre cómo funciona la segmentación por categoría: ¡a menudo es más útil recuperarla por babosa que por ID!

benz001
fuente
La solución funcionó. Buena explicación
Kamesh Jungi
1
A partir de Woocommerce 3, la visibilidad cambia a taxonomía en lugar de meta, por lo que debe cambiar meta_query a tax_query. Ver wordpress.stackexchange.com/a/262628/37355 .
jarnoan
Tu conclusión sobre get_posts()está mal. Puede reemplazar new WP_Query($args)con get_posts($args)en su código y funcionará.
Bjorn
2

cambie la categoría (category-slug-name) por id o name 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(); ?>
dalveer
fuente
2

Un poco tarde, pero me gustaría aclarar las cosas y proporcionar una respuesta más limpia. El usuario @ benz001 dio una posible respuesta válida, pero dijo algo incorrecto: get_postsdevuelve cualquier tipo de postspost-type, por defecto a post-type, al igual que 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 $argsmatriz:

  • La definición del tipo de mensaje 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 siguientes líneas

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

Le mostrará los productos necesarios :)

Todos los demás parámetros adicionales mostrados por @ benz001 son, por supuesto, válidos pero no solicitados por el OP, por lo que decidí dejarlos atrás en esta respuesta.

Erenor Paz
fuente
2
$products = wc_get_products(array(
    'category' => array('your-category-slug'),
));
Kaspi
fuente
OP solicitó específicamente obtener productos usando un ID de categoría, sin embargo, esto me ayudó, así que votaré de todos modos. Solo tenga en cuenta que no responde la pregunta original
dKen