Ottenere l'elenco dei prodotti di una categoria specifica

3 mar 2018, 13:25:39
Visualizzazioni: 16.3K
Voti: 3

Voglio ottenere un elenco di prodotti di una categoria specifica usando WP_query, ma non funziona come dovrebbe.

Ho provato questo:

$args = array( 
    'post_type' => 'product',
    'product_cat' => 17,
);
$products = new WP_Query($args);

Ma questo restituisce tutti i prodotti del mio negozio... Ho anche provato con gli attributi 'cat', 'category' e 'category_name' con lo stesso risultato.

Ho provato a usare tax_query:

$args = array( 
    'post_type' => 'product',
    'tax_query' => array(
        'taxonomy' => 'product_cat',
        'terms'    => 17
    ),
);
$products = new WP_Query($args);

E anche questo restituisce tutti i prodotti Ho provato anche con 'cat', 'category' e 'category_name' con lo stesso risultato.

Sono riuscito a ottenere i normali post di una categoria specifica con questo codice:

$args = array( 
    'post_type' => 'post',
    'cat'       => 22
);
$posts = new WP_Query($args);

Alcune cose aggiuntive:

  • Sono sicuro di avere l'ID corretto della categoria.
  • tax_query ha funzionato anche per i post
  • modifica: tax_query restituisce tutti i prodotti, ignorando il mio attributo product_cat

    Ho cercato di risolvere questo problema per giorni e ho provato ogni possibile soluzione trovata su Stack e altri siti senza successo... Perché non funziona per i prodotti?

MODIFICA: lo snippet di codice con tax_query era sbagliato, quindi l'ho modificato.

MODIFICA 2: Ho provato diverse nuove cose, ecco il riepilogo:

  • disabilitati tutti gli hook personalizzati: stesso risultato
  • istanziato manualmente un WC_Product usando l'ID di un prodotto reale come argomento. Mostra che il suo attributo category_ids è vuoto, anche se il prodotto ha una categoria nel pannello di amministrazione... e la pagina della tassonomia della categoria mostra le cose giuste.
  • quando faccio var_dump(get_the_terms($postID, 'category')); su un post normale funziona bene

MODIFICA 3: - disabilitati tutti i plugin tranne WooCommerce con lo stesso risultato... - quando faccio var_dump(get_post_types());, il post type product non viene mostrato. E naturalmente, quando faccio var_dump(get_object_taxonomies('product'));, restituisce un array vuoto.

14
Commenti

'cat', 'category', 'category_name' e 'product_cat' non funzioneranno come argomenti perché le categorie di prodotti sono una tassonomia separata rispetto alle categorie standard, e hai bisogno di un tax_query per interrogare tassonomie personalizzate. Non vedo nulla di sbagliato nel codice della tax query qui presente. O l'ID è effettivamente errato, oppure product e 'product_cat' non sono i nomi corretti per il post type e la tassonomia. Sarebbero corretti se stai usando WooCommerce. Lo stai usando?

Jacob Peattie Jacob Peattie
3 mar 2018 13:45:58

Assicurati anche di non utilizzare l'hook pre_get_posts da qualche parte in un modo che potrebbe interferire con questa query.

Jacob Peattie Jacob Peattie
3 mar 2018 13:51:41

Hai provato ad aggiungere 'suppress_filters' => false ? Solo un'idea che mi è venuta in mente. Non so se ci siano filtri da sopprimere dato che non hai menzionato cosa usi per i prodotti.

Beee Beee
3 mar 2018 14:31:26

@JacobPeattie Io uso woocommerce per questo. Per l'ID della categoria, ho controllato i parametri dell'URL nel pannello di amministrazione quando modifico una categoria, quindi dovrebbe essere quello corretto. Come posso trovare la tassonomia corretta per una categoria di prodotto allora?

@Beee 'suppress_filters non cambia nulla

Maayam Maayam
3 mar 2018 14:42:21

product_cat è corretto per WooCommerce. Questo è il codice effettivo che stai usando? O è un esempio? Il problema potrebbe essere nel codice reale che non è presente in questo esempio, perché questo codice va bene.

Jacob Peattie Jacob Peattie
3 mar 2018 14:43:52

@JacobPeattie Sto usando questo codice così com'è. Si trova nel function.php del mio child theme perché voglio creare l'output per un shortcode personalizzato. Inoltre, ho alcuni prodotti salvati in diverse categorie. Sto lavorando dopo un ragazzo che ha aggiunto alcuni filtri/hook. Avete qualche idea su cosa potrebbe causare questo problema?

Maayam Maayam
3 mar 2018 14:48:23

Anche se uso un ID di categoria inesistente Restituisce tutti i prodotti con la versione tax_query

Maayam Maayam
3 mar 2018 14:54:02

"Sto lavorando dopo un ragazzo che ha aggiunto alcuni filtri/hook." — forse uno degli hook ha causato il problema? Prova a disabilitare uno o più hook, quelli che pensi possano essere rilevanti. In alternativa, prova var_dump( wc_get_products( array( 'category' => '{SLUG}', 'limit' => 1, ) ) ); (sostituisci {SLUG} con lo slug effettivo della categoria). Solo per vedere se funziona usando wc_get_products().

Sally CJ Sally CJ
3 mar 2018 15:55:21

Ho provato la tua idea. Ho disabilitato tutti gli hook personalizzati e provato il tuo snippet @Sally e restituisce un array vuoto. Sembra che quando istanzio un WC_Product passando l'ID di un prodotto, il suo attributo 'category_ids' è vuoto, anche se il prodotto ha una categoria nel pannello di amministrazione... Quello che non capisco è che quando visito la pagina della categoria, i prodotti di questa categoria e solo di questa categoria vengono visualizzati. Quindi WordPress in qualche modo riesce a fare questa query di prodotti per categoria

Maayam Maayam
3 mar 2018 16:04:18

Prova a passare a un tema diverso, quindi esegui la query WC_Product su quel prodotto che hai testato. Se funziona, continua a cercare eventuali codici nei file del tuo tema che potrebbero causare il problema. Altrimenti, puoi provare a disattivare i plugin uno per uno, escludendo WooCommerce. Puoi anche riassegnare la categoria al prodotto e interrogarlo utilizzando le funzioni di WooCommerce o le funzioni native di WordPress.

Sally CJ Sally CJ
3 mar 2018 16:39:42

Ok @Sally e gli altri, grazie per le vostre risposte! Purtroppo non sono ancora riuscito a risolvere il mio problema... Ho passato al tema Twenty-Seventeen, disabilitato tutti i plugin tranne WooCommerce con lo stesso risultato... Ho scoperto però qualcos'altro, quando faccio var_dump(get_post_types());, il post type product non appare. E quindi naturalmente, quando faccio var_dump(get_object_taxonomies('product'));, restituisce un array vuoto... qualche altro indizio? Sono totalmente perso qui...

Maayam Maayam
3 mar 2018 17:13:53

Dove stai eseguendo questo codice? Se lo fai troppo presto, i post type e le tassonomie non saranno ancora stati registrati.

Jacob Peattie Jacob Peattie
3 mar 2018 17:24:46

Sì, Jacob ha ragione. I tipi di post personalizzati vengono normalmente registrati durante l'hook init; quindi se esegui il codice prima che questo hook venga chiamato, potrebbe essere quella la causa del problema. Prova a eseguire il codice tax_query che hai in woocommerce_loaded. Esempio Oppure altri hook come admin_init, ecc.

Sally CJ Sally CJ
3 mar 2018 17:34:12

Oh sì, stavo inserendo questo codice direttamente in functions.php senza usare alcun hook... Ho inserito il codice in uno shortcode personalizzato (in modo che venga eseguito dopo che tutto è stato inizializzato) e quando lo shortcode viene chiamato, il post_type del prodotto e le sue tassonomie vengono visualizzati correttamente.

Quando uso il codice tax_query, restituisce ancora ogni singolo post del mio negozio. Ma ora, quando istanzio un WC_product con il suo id, l'attributo category_ids non è più vuoto!

Per ora posso gestire la situazione così, ma se qualcuno ha una soluzione migliore, sono pronto ad accettarla. Aspetterò un po' prima di pubblicare una soluzione completa.

Maayam Maayam
3 mar 2018 20:56:45
Mostra i restanti 9 commenti
Tutte le risposte alla domanda 2
0

Lo so, sono in ritardo per rispondere a questa domanda ma può essere utile ad altri.

$args = array(      
        'post_type' => 'product',
        'post_status' => 'publish',
        'tax_query' => array(
                        array(
                            'taxonomy' => 'product_cat',
                            'field'    => 'term_id',
                            'terms'    => array($cat_id1,$cat_id2),
                            ),
                        ),
            );

$query = new WP_Query($args);

È stato testato e funziona su WC 3.9.1

11 apr 2020 17:00:35
0

Alla fine il mio problema principale si è rivelato essere il fatto che stavo eseguendo codice direttamente in functions.php (a scopo di test). Il codice veniva eseguito prima che woocommerce fosse inizializzato e quindi falliva nel recuperare correttamente i prodotti. Nonostante ciò, non sono riuscito a far sì che Wp_Query restituisse solo i prodotti di una determinata categoria. Continuava a restituire ogni prodotto dal mio database, quindi ho trovato una soluzione alternativa.

$category; //questa è la variabile contenente lo slug della categoria desiderata
$productPosts = new WP_Query(array(
    'post_type' => 'product'
));

//Avrei potuto usare $productPosts->have_posts() qui ma ho deciso di non usarlo nel mio contesto specifico
foreach ($productPosts->posts as $p) {
    $currentProduct = new WC_Product_Variable($p->ID);

    //Posso accedere solo agli ID delle categorie con WC_Product, quindi creo un array di slug di categoria invece
    foreach ($currentProduct->get_category_ids() as $catId) {
        if( $term = get_term_by( 'id', $catId, 'product_cat' ) ){
            array_push($categories, $term->name); //lo aggiungo
        }
    }

    if(in_array($category, $categories)){ //se il currentProduct corrente ha la categoria richiesta,
        //lo aggiungo in $currentProduct nell'array $products
        array_push($products, $currentProduct);
    }
    else{//il prodotto corrente non ha la categoria richiesta
    }
} //fine foreach, ora abbiamo tutti i prodotti della categoria richiesta... nell'array $products

Questo funziona... Ma davvero, sembra sbagliato. Sto facendo diverse query al database per ogni prodotto che voglio includere nel mio array finale... È così che dovrebbe funzionare woocommerce? Inoltre, non sono sicuro di come dovrei gestire la paginazione con questi dati ma comunque non è il mio problema qui...

Deve esserci un modo migliore per farlo ma per ora non l'ho trovato...

5 mar 2018 09:55:58