Obține lista de produse pentru un ID de categorie dat

7 mai 2014, 00:06:11
Vizualizări: 172K
Voturi: 30

Nu am putut găsi modalitatea corectă de a obține lista tuturor produselor pentru un ID de categorie dat (nu numele categoriei).

Codul pe care îl folosesc pentru a obține lista categoriilor funcționează bine:

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

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

Cu toate acestea, acum pentru un ID de categorie dat (să zicem 47), nu am putut găsi modalitatea de a obține produsele relevante. Am încercat următoarea metodă:

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

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

Depanarea array-ului $products returnează întotdeauna 0, ceea ce este greșit deoarece știu că există câteva produse în categoria cu ID-ul 47. Aveți idei cum să corectez codul meu?

2
Comentarii

category sau product_category?

fuxia fuxia
14 mai 2014 21:34:10

folosești echo pe var_dump. Întotdeauna va afișa 0 sau 1. Apropo, obiectul nu a preluat nimic, deoarece 0 înseamnă fals. Problema este că nu ai specificat niciun post_type, așa că va folosi implicit "post". Deci probabil nu există niciun ID 47 în categoria de postări.

Behemoth Behemoth
9 mai 2023 07:00:17
Toate răspunsurile la întrebare 6
3
30

Bănuiesc că principala problemă este că ar trebui să folosești obiectul WP_Query în loc de get_posts(). Acesta din urmă, implicit, returnează doar elemente cu un post_type de post, nu produse.

Deci, pentru o categorie cu ID-ul 26, următorul cod ar returna produsele sale (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', //Acest lucru este opțional, deoarece implicit este 'term_id'
            'terms'         => 26,
            'operator'      => 'IN' // Valorile posibile sunt 'IN', 'NOT IN', 'AND'.
        ),
        array(
            'taxonomy'      => 'product_visibility',
            'field'         => 'slug',
            'terms'         => 'exclude-from-catalog', // Posibil și 'exclude-from-search'
            'operator'      => 'NOT IN'
        )
    )
);
$products = new WP_Query($args);
var_dump($products);

În versiunile anterioare ale WooCommerce, vizibilitatea era stocată ca un câmp meta, deci codul ar fi:

    $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', //Acest lucru este opțional, deoarece implicit este 'term_id'
            'terms'         => 26,
            'operator'      => 'IN' // Valorile posibile sunt 'IN', 'NOT IN', 'AND'.
        )
    )
);
$products = new WP_Query($args);
var_dump($products);

Aici returnăm doar produsele vizibile, 12 pe pagină.

Consultă http://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters pentru mai multe detalii despre cum funcționează țintirea categoriilor - este adesea mai util să le obții după slug decât după ID!

2 iun. 2014 13:53:57
Comentarii

Soluția a funcționat. Explicație bună.

Kamesh Jungi Kamesh Jungi
10 iul. 2015 09:26:09

Începând cu WooCommerce 3, vizibilitatea a fost schimbată în taxonomie în loc de meta, așa că trebuie să schimbați meta_query în tax_query. Vezi https://wordpress.stackexchange.com/a/262628/37355.

jarnoan jarnoan
18 oct. 2017 10:10:14

Concluzia ta despre get_posts() este greșită. Poți înlocui new WP_Query($args) cu get_posts($args) în codul tău și va funcționa.

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

OP a cerut în mod specific obținerea produselor folosind un ID de categorie, totuși, acest lucru m-a ajutat, așa că voi vota pozitiv oricum. Doar să fii conștient că nu răspunde la întrebarea inițială

dKen dKen
24 sept. 2019 20:34:18
0

schimbă categoria (numele-slug-categorie) după ID, nume sau slug

<?php

$args = array( 'post_type' => 'product', 'stock' => 1, 'posts_per_page' => 2,'product_cat' => 'numele-slug-categorie', 'orderby' =>'date','order' => 'ASC' );
  $loop = new WP_Query( $args );
while ( $loop->have_posts() ) : $loop->the_post();
global $product; 
?>
În cadrul buclei putem prelua imaginea Produsului, titlu, descriere, preț etc.

<?php endwhile; wp_reset_query(); ?>
19 ian. 2015 14:21:04
0

Un pic mai târziu, dar aș vrea să clarific lucrurile și să ofer un răspuns mai clar. Utilizatorul @benz001 a oferit un răspuns posibil valid, dar a spus ceva greșit: get_posts returnează orice tip de postări, implicit fiind tipul posts, exact ca WP_Query. Diferențele reale dintre cele două sunt explicate minunat AICI.

Problemă reală a fost că OP pur și simplu a omis câțiva parametri în tabloul $args:

  • Definirea tipului de postare pe care o căuta:

        'post_type'             => 'product',
    
  • Și modificarea părții de "taxonomie" din interogarea de căutare:

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

În acest fel, următoarele linii

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

Vă vor afișa produsele dorite :)

Toți ceilalți parametri adiționali afișați de @benz001 sunt desigur valizi, dar nu au fost solicitați de OP, așa că am decis să îi omit în acest răspuns.

18 nov. 2016 13:22:49
0

Prin utilizarea funcției WordPress get_posts

Obțineți toate ID-urile produselor WooCommerce după categorie

În codul de mai jos, trebuie doar să adăugați numele categoriei și va funcționa.

$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', /*numele categoriei*/
        'operator' => 'IN',
        )
     ),
  ));
  foreach ( $all_ids as $id ) {
     echo $id;
  }
16 sept. 2020 13:25:39
0

Acest cod funcționează când se utilizează fișierul template taxonomy-product-cat.php

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