Dapatkan daftar produk dari ID Kategori yang diberikan

14

Saya tidak dapat menemukan cara yang tepat untuk mendapatkan daftar semua produk untuk ID kategori tertentu (bukan nama kategori).

Kode yang saya gunakan untuk mendapatkan daftar kategori adalah sebagai berikut, berfungsi dengan baik:

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

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

Namun, sekarang untuk ID kategori tertentu (katakanlah 47), saya tidak bisa menemukan cara untuk mendapatkan produk yang relevan. Saya mencoba cara berikut:

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

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

Debugging $productsarray mengembalikan selalu 0 yang salah karena saya tahu ada beberapa produk di bawah kategori dengan ID 47. Ada ide bagaimana cara memperbaiki kode saya?

Malloc
sumber
1
categoryatau product_category?
fuxia

Jawaban:

19

Saya menduga masalah utama adalah bahwa Anda harus menggunakan WP_Queryobjek daripada get_posts(). Nanti secara default hanya mengembalikan item dengan post_type postbukan produk,

Jadi dengan kategori ID 26, kode berikut akan mengembalikan produknya (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);

Dalam versi WooCommerce sebelumnya, visibilitas disimpan sebagai bidang meta, jadi kodenya adalah:

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

Di sini kami hanya mengembalikan produk yang terlihat, 12 per halaman.

Lihat http://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters untuk rincian lebih lanjut tentang cara kerja penargetan kategori - seringkali lebih bermanfaat untuk mengambilnya dengan slug daripada dengan ID!

benz001
sumber
Solusi berhasil. Penjelasan yang bagus.
Kamesh Jungi
1
Pada Woocommerce 3, visibilitas diubah menjadi taksonomi alih-alih meta sehingga Anda perlu mengubah meta_query menjadi tax_query. Lihat wordpress.stackexchange.com/a/262628/37355 .
jarnoan
Kesimpulan Anda tentang get_posts()itu salah. Anda dapat mengganti new WP_Query($args)dengan get_posts($args)dalam kode Anda dan itu akan berfungsi.
Bjorn
2

ganti kategori (kategori-slug-nama) dengan id atau nama atau siput

<?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(); ?>
dalveer
sumber
2

Sedikit terlambat, tetapi ingin mengklarifikasi hal-hal dan memberikan jawaban yang lebih bersih. Pengguna @ benz001 memberikan jawaban yang valid yang mungkin, tetapi mengatakan sesuatu yang salah: get_postsmengembalikan semua jenis postingan, default ke postspost-type, sama seperti WP_Query. Perbedaan nyata antara keduanya dijelaskan dengan HERE .

Faktanya adalah, OP hanya melewatkan beberapa parameter ke dalam $argsarray:

  • Definisi tipe post yang ia cari:

        'post_type'             => 'product',
  • Dan modifikasi "bagian taksonomi" dari permintaan pencarian:

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

Dengan cara ini, baris Anda berikutnya

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

Akan menunjukkan kepada Anda produk yang dibutuhkan :)

Semua parameter tambahan lainnya yang ditunjukkan oleh @ benz001 tentu saja valid tetapi tidak diminta oleh OP, jadi saya memutuskan untuk meninggalkannya di jawaban ini.

Erenor Paz
sumber
2
$products = wc_get_products(array(
    'category' => array('your-category-slug'),
));
Kaspi
sumber
OP secara khusus meminta untuk mendapatkan produk menggunakan ID kategori, namun, ini membantu saya, jadi bagaimanapun saya akan menjawab. Ketahuilah bahwa itu tidak menjawab pertanyaan awal
dKen