Ottenere la lista dei prodotti di un determinato ID Categoria

7 mag 2014, 00:06:11
Visualizzazioni: 172K
Voti: 30

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 utilizzando per ottenere l'elenco delle categorie è il seguente, funziona bene:

$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 correlati. Ho provato nel seguente modo:

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

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

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

2
Commenti

category o product_category?

fuxia fuxia
14 mag 2014 21:34:10

stai usando echo su var_dump. Mostrerà sempre 0 o 1. Comunque l'oggetto non ha recuperato nulla poiché 0 significa falso. Il problema è che non hai specificato alcun post_type, quindi utilizzerà il default "post". Probabilmente non esiste alcun ID 47 sotto le categorie dei post.

Behemoth Behemoth
9 mag 2023 07:00:17
Tutte le risposte alla domanda 6
3
30

Sospetto che il problema principale sia che dovresti utilizzare l'oggetto WP_Query invece di get_posts(). Quest'ultimo per default restituisce solo elementi con post_type post e non prodotti.

Quindi, data una categoria con ID 26, il seguente codice 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', //Opzionale, di default è 'term_id'
            'terms'         => 26,
            'operator'      => 'IN' // Valori possibili: 'IN', 'NOT IN', 'AND'.
        ),
        array(
            'taxonomy'      => 'product_visibility',
            'field'         => 'slug',
            'terms'         => 'exclude-from-catalog', // Possibilmente anche 'exclude-from-search'
            'operator'      => 'NOT IN'
        )
    )
);
$products = new WP_Query($args);
var_dump($products);

Nelle versioni precedenti di WooCommerce la visibilità era memorizzata come meta campo, 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', //Opzionale, di default è 'term_id'
            'terms'         => 26,
            'operator'      => 'IN' // Valori possibili: 'IN', 'NOT IN', 'AND'.
        )
    )
);
$products = new WP_Query($args);
var_dump($products);

Qui stiamo restituendo 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 delle categorie - spesso è più utile recuperarle per slug piuttosto che per ID!

2 giu 2014 13:53:57
Commenti

La soluzione ha funzionato. Ottima spiegazione.

Kamesh Jungi Kamesh Jungi
10 lug 2015 09:26:09

A partire da WooCommerce 3, la visibilità è stata cambiata in tassonomia invece che meta, quindi devi cambiare meta_query in tax_query. Vedi https://wordpress.stackexchange.com/a/262628/37355.

jarnoan jarnoan
18 ott 2017 10:10:14

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

Bjorn Bjorn
14 lug 2018 12:43:59
1
24
$products = wc_get_products([
   'category' => get_term($category_id, 'product_cat')->slug
]);
29 lug 2019 14:54:03
Commenti

L'OP ha specificamente chiesto di ottenere i prodotti utilizzando un ID di categoria, tuttavia questo mi è stato utile, quindi voterò comunque a favore. Tieni solo presente che non risponde alla domanda originale

dKen dKen
24 set 2019 20:34:18
0

cambia categoria (category-slug-name) per ID, nome o 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; 
?>
All'interno del loop possiamo ottenere immagine del prodotto, titolo, descrizione, prezzo ecc.

<?phpendwhile;wp_reset_query(); ?>
19 gen 2015 14:21:04
0

Un po' in ritardo, ma vorrei chiarire le cose e fornire una risposta più pulita. L'utente @benz001 ha dato una risposta potenzialmente valida, ma ha detto qualcosa di sbagliato: get_posts restituisce qualsiasi tipo di post-type, con il default su posts, proprio come WP_Query. Le vere differenze tra i due sono spiegate meravigliosamente QUI.

Il fatto è che l'OP stava semplicemente tralasciando alcuni parametri nell'array $args:

  • La definizione del post-type che stava 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 mostreranno i prodotti necessari :)

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

18 nov 2016 13:22:49
0

Utilizzando la funzione get_posts di WordPress

Ottenere tutti gli ID dei prodotti WooCommerce per categoria

Nel codice seguente, è sufficiente aggiungere il nome della categoria e funzionerà.

$all_ids = get_posts( array(
  'post_type' => 'product',
  'numberposts' => -1,
  'post_status' => 'publish',
  'fields' => 'ids',
  'tax_query' => array(
     array(
        'taxonomy' => 'product_cat',
        'field' => 'slug',
        'terms' => 'your_product_category', /*nome della categoria*/
        'operator' => 'IN',
        )
     ),
  ));
  foreach ( $all_ids as $id ) {
     echo $id;
  }
16 set 2020 13:25:39
0

Funziona quando si utilizza il file template taxonomy-product-cat.php

$products = wc_get_products(['category_id' => get_queried_object_id()]);
2 dic 2021 12:58:23