Obter a lista de produtos de um determinado ID de categoria

14

Não consegui encontrar o caminho certo para obter a lista de todos os produtos para um determinado ID de categoria (não o nome da categoria).

O código que estou usando para obter a lista de categorias é o seguinte, funciona bem:

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

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

No entanto, agora para um determinado ID de categoria (por exemplo, 47), não consegui encontrar o caminho para obter seus produtos relevantes. Eu tentei da seguinte maneira:

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

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

A depuração da $productsmatriz sempre retorna 0, o que está errado, pois sei que existem alguns produtos na categoria com o ID 47. Alguma idéia de como corrigir meu código?

Malloc
fonte
1
categoryou product_category?
fuxia

Respostas:

19

Eu suspeito que o principal problema é que você deveria estar usando o WP_Queryobjeto em vez de get_posts(). O posterior, por padrão, retorna apenas itens com um post_type de postnão produtos,

Portanto, dada uma categoria com ID 26, o código a seguir retornaria seus produtos (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);

Nas versões anteriores do WooCommerce, a visibilidade era armazenada como um meta campo, portanto o código seria:

    $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);

Aqui estamos devolvendo apenas produtos visíveis, 12 por página.

Dê uma olhada em http://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters para obter mais detalhes sobre como a segmentação por categoria funciona - geralmente é mais útil recuperá-la por lesma do que por ID!

benz001
fonte
Solução funcionou. Boa explicação.
Kameh Jungi
1
No Woocommerce 3, a visibilidade é alterada para taxonomia em vez de meta, então você precisa alterar a meta_query para tax_query. Consulte wordpress.stackexchange.com/a/262628/37355 .
jarnoan
Sua conclusão sobre get_posts()está errada. Você pode substituir new WP_Query($args)por get_posts($args)no seu código e ele funcionará.
Bjorn
2

alterar categoria (categoria-nome-da-lesma) pelo ID ou nome ou lesma

<?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
fonte
2

Um pouco tarde, mas gostaria de esclarecer as coisas e fornecer uma resposta mais limpa. O usuário @ benz001 deu uma possível resposta válida, mas disse algo errado: get_postsretorna qualquer tipo de postspost-type, por padrão, pós-type, exatamente como WP_Query. As reais diferenças entre os dois são maravilhosamente explicadas AQUI .

O fato é que o OP simplesmente estava perdendo alguns parâmetros na $argsmatriz:

  • A definição do pós-tipo que ele está procurando:

        'post_type'             => 'product',
  • E a modificação da "parte da taxonomia" da consulta de pesquisa:

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

Desta forma, suas próximas linhas

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

Irá mostrar-lhe os produtos necessários :)

Como todos os outros parâmetros adicionais mostrados por @ benz001 são válidos, mas não solicitados pelo OP, decidi deixá-los para trás nesta resposta.

Erenor Paz
fonte
2
$products = wc_get_products(array(
    'category' => array('your-category-slug'),
));
Kaspi
fonte
A OP solicitou especificamente a obtenção de produtos usando um ID de categoria; no entanto, isso me ajudou, por isso vou votar de qualquer maneira. Basta estar ciente de que não responde à pergunta original
dKen