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.