Obține lista de produse dintr-o anumită categorie

3 mar. 2018, 13:25:39
Vizualizări: 16.3K
Voturi: 3

Vreau să obțin o listă de produse dintr-o anumită categorie folosind WP_query, dar nu funcționează cum ar trebui.

Am încercat asta:

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

Dar aceasta returnează toate produsele din magazinul meu... Am încercat și cu 'cat', 'category' și 'category_name' cu același rezultat.

Am încercat să folosesc tax_query:

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

Și aceasta returnează toate produsele Am încercat și cu 'cat', 'category' și 'category_name' cu același rezultat.

Am reușit să obțin postări obișnuite dintr-o anumită categorie folosind următorul cod.

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

Câteva detalii suplimentare:

  • Sunt sigur că am ID-ul corect al categoriei.
  • tax_query a funcționat și pentru postări
  • edit: tax_query returnează toate produsele, ignorând atributul meu product_cat

    Am căutat să fac asta de zile întregi și am încercat fiecare soluție posibilă din întrebări similare de pe stack și alte site-uri fără succes... De ce nu funcționează pentru produse?

EDIT: fragmentul de cod cu tax_query era greșit, așa că l-am schimbat.

EDIT 2: Am încercat mai multe lucruri noi, iată rezumatul:

  • am dezactivat toate hook-urile personalizate: aceleași rezultate
  • am instanțiat manual un WC_Product prin ID-ul unui produs existent ca argument. Acesta arată că atributul category_ids este gol, chiar dacă produsul are o categorie în panoul de administrare... și pagina de taxonomie a categoriei arată corect.
  • când fac var_dump(get_the_terms($postID, 'category')); pentru o postare obișnuită, funcționează bine

EDIT 3: - am dezactivat toate plugin-urile, cu excepția WooCommerce, cu același rezultat... - când fac var_dump(get_post_types());, tipul de postare product nu apare. Și, în mod natural, când fac var_dump(get_object_taxonomies('product'));, returnează un array gol.

14
Comentarii

'cat', 'category', 'category_name' și 'product_cat' nu vor funcționa ca argumente deoarece categoriile de produse sunt o taxonomie separată de categorii și ai nevoie de un tax_query pentru a interoga taxonomiile personalizate. Nu văd nicio problemă în codul pentru interogarea taxonomiei prezent aici. Fie ID-ul este de fapt greșit, fie product și product_cat nu sunt numele corecte pentru tipul de post și taxonomie. Ele ar fi corecte dacă folosești WooCommerce. O faci?

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

De asemenea, asigură-te că nu folosești hook-ul pre_get_posts undeva într-un mod care ar putea interfera cu această interogare.

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

Ai încercat să adaugi 'suppress_filters' => false? Doar o idee care mi-a venit rapid. Nu știu dacă există filtre de suprimat deoarece nu ai menționat ce folosești pentru produse.

Beee Beee
3 mar. 2018 14:31:26

@JacobPeattie Eu folosesc WooCommerce pentru asta. Pentru ID-ul categoriei, am verificat parametrii din URL în panoul de administrare când editez o categorie, deci ar trebui să fie cel corect. Cum pot găsi taxonomia corectă pentru o categorie de produse atunci?

@Beee 'suppress_filters nu schimbă nimic

Maayam Maayam
3 mar. 2018 14:42:21

product_cat este corect pentru WooCommerce. Acesta este codul pe care îl folosești de fapt? Sau doar un exemplu? Problema ar putea fi în codul real care nu este prezent în acest exemplu, pentru că acest cod este corect.

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

@JacobPeattie Folosesc acest cod exact așa cum este. Este localizat în fișierul function.php al temei mele child, pentru că vreau să construiesc un output pentru un shortcode personalizat. De asemenea, am câteva produse salvate în mai multe categorii diferite. Lucrez după un tip care a adăugat niște filtre/hook-uri. Aveți vreo idee despre ce ar putea face ca asta să nu funcționeze corect?

Maayam Maayam
3 mar. 2018 14:48:23

Chiar dacă folosesc un ID de categorie care nu există, returnează toate produsele cu versiunea tax_query

Maayam Maayam
3 mar. 2018 14:54:02

"Lucrez după un tip care a adăugat niște filtre/hook-uri." — poate unul dintre hook-uri a cauzat problema? Încearcă să dezactivezi unul sau mai multe dintre hook-uri, pe cele care crezi că ar putea fi relevante. Alternativ, încearcă var_dump( wc_get_products( array( 'category' => '{SLUG}', 'limit' => 1, ) ) ); (înlocuiește {SLUG} cu slug-ul real al categoriei). Doar pentru a vedea dacă funcționează folosind wc_get_products().

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

Am încercat ideea ta. Am dezactivat toate hook-urile personalizate și am testat fragmentul tău @Sally, dar returnează un array gol. Se pare că atunci când instantiez un WC_Product furnizând ID-ul unui produs, atributul său 'category_ids' este gol, chiar dacă în panoul de administrare produsul are o categorie... Ce nu înțeleg este că atunci când vizitez pagina categoriei, produsele din această categorie și numai din această categorie sunt afișate. Deci WordPress reușește cumva să facă această interogare de produse după categorie

Maayam Maayam
3 mar. 2018 16:04:18

Încearcă să schimbi la o altă temă, apoi rulează interogarea WC_Product pe acel produs pe care l-ai testat. Dacă funcționează, atunci continuă să cauți orice cod în fișierele temei tale care ar putea cauza problema. În caz contrar, poți încerca să dezactivezi pluginurile unul câte unul, excluzând WooCommerce. De asemenea, poți reatribui categoria produsului și să interoghezi folosind funcțiile WooCommerce sau funcțiile native WordPress.

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

Ok @Sally și ceilalți, vă mulțumesc pentru răspunsuri ! Din păcate încă nu am reușit să rezolv problema mea... Am trecut la tema Twenty-Seventeen, am dezactivat toate pluginurile în afară de WooCommerce cu același rezultat... Am descoperit totuși altceva, când fac var_dump(get_post_types());, tipul de postare product nu apare. Și firesc, când fac var_dump(get_object_taxonomies('product'));, returnează un array gol... mai sunt alte indicii? Sunt complet pierdut aici...

Maayam Maayam
3 mar. 2018 17:13:53

Unde rulezi acest cod? Dacă o faci prea devreme, atunci tipurile de postări și taxonomiile nu vor fi înregistrate încă.

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

Da, Jacob are dreptate. Tipurile personalizate de postări sunt în mod normal înregistrate în timpul hook-ului init; deci dacă rulezi codul înainte ca acest hook să fie apelat, atunci aceasta ar putea fi cauza problemei. Încearcă să rulezi codul tax_query pe care îl ai în woocommerce_loaded. Exemplu Sau alte hook-uri precum admin_init, etc.

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

Ah da, eu puneam acest cod direct în functions.php fără a folosi deloc hook-uri... Am pus codul într-un shortcode personalizat (astfel încât să fie executat după ce totul este inițializat) și când shortcode-ul este apelat, post_type-ul produsului și taxonomiile sale apar corect.

Când folosesc codul tax_query, acesta în continuare returnează toate postările din magazinul meu. Dar acum, când instantiez un WC_product cu id-ul său, atributul category_ids nu mai este gol!

Mă pot descurca cu asta deocamdată, dar dacă cineva are o soluție mai bună, o accept. Voi mai aștepta puțin înainte să postez o soluție completă.

Maayam Maayam
3 mar. 2018 20:56:45
Arată celelalte 9 comentarii
Toate răspunsurile la întrebare 2
0

Știu că am întârziat să răspund la această întrebare, dar sper să ajute pe alții.

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

Codul a fost testat și funcționează pe WooCommerce 3.9.1

11 apr. 2020 17:00:35
0

În final, principala mea problemă s-a dovedit a fi faptul că executam cod direct în functions.php (în scop de testare). Codul se executa înainte ca WooCommerce să fie inițializat și, astfel, nu reușea să preia corect produsele.

În ciuda acestui lucru, nu am reușit să fac ca Wp_Query să returneze doar produsele dintr-o anumită categorie. Continuam să primesc toate produsele din baza de date, așa că am găsit o soluție alternativă.

$category; //acesta este variabila care conține slug-ul categoriei dorite
$productPosts = new WP_Query(array(
    'post_type' => 'product'
));

//Aș fi putut folosi $productPosts->have_posts() aici, dar am decis să nu o folosesc în contextul meu specific
foreach ($productPosts->posts as $p) {
    $currentProduct = new WC_Product_Variable($p->ID);

    //Pot accesa doar ID-urile categoriilor cu WC_Product, așa că construiesc un array de slug-uri de categorii
    foreach ($currentProduct->get_category_ids() as $catId) {
        if( $term = get_term_by( 'id', $catId, 'product_cat' ) ){
            array_push($categories, $term->name); //adaugă în array
        }
    }

    if(in_array($category, $categories)){ //dacă currentProduct are categoria cerută,
        //adaugă $currentProduct în array-ul $products
        array_push($products, $currentProduct);
    }
    else{//produsul curent nu are categoria cerută
    }
} //sfârșit foreach, acum avem toate produsele din categoria dorită... în array-ul $products

Această soluție funcționează... Dar, sincer, pare greșită. Fac mai multe interogări la baza de date pentru fiecare produs pe care vreau să-l includ în array-ul final... Așa ar trebui să funcționeze WooCommerce?

De asemenea, nu sunt sigur cum ar trebui să implementez paginarea cu aceste date, dar oricum nu este problema mea aici...

Cu siguranță există o metodă mai bună de a face asta, dar nu am găsit-o încă...

5 mar. 2018 09:55:58