Uzyskaj listę produktów o danym identyfikatorze kategorii

14

Nie mogłem znaleźć właściwego sposobu na uzyskanie listy wszystkich produktów dla danego identyfikatora kategorii (nie nazwy kategorii).

Kod, którego używam do uzyskania listy kategorii, jest następujący: działa dobrze:

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

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

Jednak teraz dla danego identyfikatora kategorii (powiedzmy 47) nie mogłem znaleźć sposobu na uzyskanie odpowiednich produktów. Próbowałem w następujący sposób:

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

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

Debugowanie $productstablicy zawsze zwraca 0, co jest błędne, ponieważ wiem, że w tej kategorii są produkty o identyfikatorze 47. Jakieś pomysły, jak naprawić mój kod?

Malloc
źródło
1
categoryczy product_category?
fuxia

Odpowiedzi:

19

Podejrzewam, że głównym problemem jest to, że powinieneś używać WP_Queryobiektu, a nie get_posts(). Później domyślnie zwraca tylko produkty o typie post_nie postproduktów,

Biorąc pod uwagę kategorię o identyfikatorze 26, poniższy kod zwróci jej produkty (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);

We wcześniejszych wersjach WooCommerce widoczność była przechowywana jako pole meta, więc kod będzie:

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

Tutaj zwracamy tylko widoczne produkty, 12 na stronę.

Przejrzyj http://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters, aby uzyskać więcej informacji na temat działania kierowania na kategorie - często bardziej przydatne jest wyszukiwanie go według informacji o ślimaku niż według identyfikatora!

benz001
źródło
Rozwiązanie zadziałało. Ładne wyjaśnienie.
Kamesh Jungi,
1
Począwszy od Woocommerce 3, widoczność jest zmieniona na taksonomię zamiast meta, więc musisz zmienić kwerendę meta na kwerendę podatkową. Zobacz wordpress.stackexchange.com/a/262628/37355 .
jarnoan
Twój wniosek na temat get_posts()jest błędny. Można wymienić new WP_Query($args)ze get_posts($args)w kodzie i będzie działać.
Bjorn,
3
$products = wc_get_products(array(
    'category' => array('your-category-slug'),
));
Kaspi
źródło
OP konkretnie poprosił o uzyskanie produktów za pomocą identyfikatora kategorii, jednak pomogło mi to, więc i tak będę głosować. Tylko pamiętaj, że nie odpowiada na pierwotne pytanie
dKen
2

zmień kategorię (kategoria-ślimak-nazwa) według identyfikatora lub imienia lub ślimaka

<?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
źródło
2

Trochę późno, ale chciałbym wyjaśnić i udzielić bardziej przejrzystej odpowiedzi. Użytkownik @ benz001 podał możliwą prawidłową odpowiedź, ale powiedział coś złego: get_postszwraca dowolny typ post-typów, domyślnie ustawiony na postspost-type, tak jak WP_Query. Prawdziwe różnice między nimi są doskonale wyjaśnione TUTAJ .

Faktem jest, że OP po prostu brakowało niektórych parametrów w $argstablicy:

  • Definicja poszukiwanego typu posta:

        'post_type'             => 'product',
  • I modyfikacja „części taksonomicznej” zapytania:

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

W ten sposób twoje następne wiersze

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

Pokażę potrzebne produkty :)

Wszystkie inne dodatkowe parametry pokazane przez @ benz001 są oczywiście prawidłowe, ale nie są wymagane przez OP, więc postanowiłem je pominąć w tej odpowiedzi.

Erenor Paz
źródło