Holen Sie sich die Produktliste einer bestimmten Kategorie-ID

14

Ich konnte nicht den richtigen Weg finden, um die Liste aller Produkte für eine bestimmte Kategorie-ID (nicht den Kategorienamen) zu erhalten.

Der Code, den ich verwende, um die Kategorienliste zu erhalten, ist der folgende, es funktioniert gut:

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

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

Für eine bestimmte Kategorie-ID (z. B. 47) konnte ich jedoch nicht den Weg finden, um die relevanten Produkte zu erhalten. Ich habe es folgendermaßen versucht:

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

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

Das Debuggen des $productsArrays gibt immer 0 zurück, was falsch ist, da ich weiß, dass es einige Produkte unter der Kategorie mit der ID 47 gibt. Irgendwelche Ideen, wie man meinen Code repariert?

Malloc
quelle
1
categoryoder product_category?
fuxia

Antworten:

19

Ich vermute, das Hauptproblem ist, dass Sie das WP_QueryObjekt eher als verwenden sollten get_posts(). Das spätere gibt standardmäßig nur Artikel mit einem post_type von postnicht Produkten zurück,

Bei einer Kategorie mit der ID 26 würde der folgende Code die Produkte zurückgeben (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);

In früheren Versionen von WooCommerce wurde die Sichtbarkeit als Metafeld gespeichert, sodass der Code wie folgt lautete:

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

Hier geben wir nur sichtbare Produkte zurück, 12 pro Seite.

Unter http://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters finden Sie weitere Informationen zur Funktionsweise der Kategorieausrichtung. Oft ist es sinnvoller, sie per Slug als per ID abzurufen.

benz001
quelle
Lösung hat funktioniert. Gute Erklärung.
Kamesh Jungi
1
Ab Woocommerce 3 wird die Sichtbarkeit in Taxonomie anstelle von Meta geändert, sodass Sie die meta_query in tax_query ändern müssen. Siehe wordpress.stackexchange.com/a/262628/37355 .
jarnoan
Ihre Schlussfolgerung get_posts()ist falsch. Sie können ersetzen new WP_Query($args)mit get_posts($args)im Code und es wird funktionieren.
Bjorn
2

Ändern Sie die Kategorie (Kategorie-Slug-Name) nach ID oder Name oder 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
quelle
2

Ein bisschen spät, möchte aber die Dinge klären und eine sauberere Antwort geben. User @ benz001 hat eine mögliche gültige Antwort gegeben, aber etwas Falsches gesagt: Gibt get_postsjede Art von Post-Typ zurück, standardmäßig postsPost-Typ, genau wie WP_Query. Die wahren Unterschiede zwischen den beiden werden HIER wunderbar erklärt .

Tatsache ist, dass dem OP einfach einige Parameter im $argsArray fehlten :

  • Die Definition des Post-Typs, nach dem er sucht:

        'post_type'             => 'product',
  • Und die Änderung des "Taxonomieteils" der Suchanfrage:

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

So kommen Sie zu Ihren nächsten Zeilen

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

Zeigt dir die benötigten Produkte :)

Alle anderen von @ benz001 angezeigten zusätzlichen Parameter sind natürlich gültig, werden jedoch vom OP nicht angefordert, weshalb ich mich entschlossen habe, sie in dieser Antwort zurückzulassen.

Erenor Paz
quelle
2
$products = wc_get_products(array(
    'category' => array('your-category-slug'),
));
Kaspi
quelle
OP hat ausdrücklich darum gebeten, Produkte mit einer Kategorie-ID zu erhalten. Dies hat mir jedoch geholfen, sodass ich trotzdem positiv stimmen werde.
Beachten