Ottieni l'elenco dei prodotti di un determinato ID categoria


14

Non sono riuscito a trovare il modo giusto per ottenere l'elenco di tutti i prodotti per un determinato ID categoria (non il nome della categoria).

Il codice che sto usando per ottenere l'elenco delle categorie è il seguente, funziona benissimo:

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

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

Tuttavia, ora per un determinato ID categoria (diciamo 47), non sono riuscito a trovare il modo di ottenere i suoi prodotti pertinenti. Ho provato nel modo seguente:

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

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

Il debug $productsdell'array restituisce sempre 0 che è errato poiché so che ci sono alcuni prodotti nella categoria con ID 47. Qualche idea su come correggere il mio codice?


1
categoryo product_category?
fuxia

Risposte:


19

Sospetto che il problema principale sia che dovresti usare l' WP_Queryoggetto piuttosto che get_posts(). Il successivo per impostazione predefinita restituisce solo articoli con un post_type di postnon prodotti,

Quindi, data una categoria con ID 26, il codice seguente restituirebbe i suoi prodotti (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);

Nelle versioni precedenti di WooCommerce la visibilità era memorizzata come metacampo, quindi il codice sarebbe:

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

Qui restituiamo solo prodotti visibili, 12 per pagina.

Dai un'occhiata a http://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters per maggiori dettagli su come funziona il targeting per categoria - spesso è più utile recuperarlo per lumaca che per ID!


La soluzione ha funzionato. Bella spiegazione.
Kamesh Jungi,

1
A partire da Woocommerce 3, la visibilità viene modificata in tassonomia anziché in meta, quindi è necessario modificare la meta_query in tax_query. Vedi wordpress.stackexchange.com/a/262628/37355 .
Jarnoan,

La tua conclusione get_posts()è sbagliata. Puoi sostituirlo new WP_Query($args)con get_posts($args)nel tuo codice e funzionerà.
Bjorn,

2

cambia categoria (nome-categoria-lumaca) con id o nome o lumaca

<?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(); ?>

2

Un po 'in ritardo, ma vorrei chiarire le cose e fornire una risposta più pulita. L'utente @ benz001 ha dato una possibile risposta valida, ma ha detto qualcosa di sbagliato: get_postsrestituisce qualsiasi tipo di post-type, passando per default a postspost-type, proprio come WP_Query. Le vere differenze tra i due sono meravigliosamente spiegate QUI .

Il fatto è che all'OP mancavano semplicemente alcuni parametri $argsnell'array:

  • La definizione del tipo di post che sta cercando:

        'post_type'             => 'product',
  • E la modifica della "parte tassonomia" della query di ricerca:

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

In questo modo le tue prossime righe

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

Ti mostrerà i prodotti necessari :)

Tutti gli altri parametri aggiuntivi mostrati da @ benz001 sono ovviamente validi ma non richiesti dall'OP, quindi ho deciso di lasciarli indietro in questa risposta.


2
$products = wc_get_products(array(
    'category' => array('your-category-slug'),
));

OP ha chiesto espressamente di ottenere prodotti utilizzando un ID categoria, tuttavia questo mi ha aiutato, quindi voterò comunque. Basta essere consapevoli che non risponde alla domanda originale
dKen
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.