Belirli bir Kategori Kimliğinin ürün listesini alın


14

Belirli bir kategori kimliği (kategori adı değil) için tüm ürünlerin listesini almanın doğru yolunu bulamadım.

Kategoriler listesini almak için kullandığım kod aşağıdaki, iyi çalışıyor:

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

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

Ancak, şimdi belirli bir kategori kimliği için (diyelim ki 47), ilgili ürünlerini almanın yolunu bulamadım. Aşağıdaki şekilde denedim:

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

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

$productsDizi hata ayıklama her zaman 0 döndürür çünkü ID 47 kategorisi altında bazı ürünler olduğunu biliyorum çünkü kodumu düzeltmek için herhangi bir fikir?


1
categoryveya product_category?
fuxia

Yanıtlar:


19

Asıl sorunun WP_Querynesneyi kullanmak yerine kullanmanız gerektiğinden şüpheleniyorum get_posts(). Daha sonra varsayılan olarak, yalnızca ürün postdeğil post_type içeren öğeleri döndürür ,

Bu nedenle, 26 numaralı bir kategori verildiğinde, aşağıdaki kod ürünlerine dönecektir (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);

WooCommerce'ın önceki sürümlerinde görünürlük meta bir alan olarak depolanmıştı, bu nedenle kod şöyle olurdu:

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

Burada yalnızca sayfa başına 12 gibi görünen ürünleri iade ediyoruz.

Kategori hedeflemenin nasıl çalıştığı hakkında daha fazla bilgi için http://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters sayfasına göz atın .


Çözüm işe yaradı. Güzel açıklama.
Kamesh Jungi

1
Woocommerce 3'ten itibaren görünürlük meta yerine taksonomiye değiştirildiğinden meta_query'yi tax_query olarak değiştirmeniz gerekiyor. Bkz. Wordpress.stackexchange.com/a/262628/37355 .
Ekim'de jarnoan

Hakkındaki sonucun get_posts()yanlış. Kodunuzda new WP_Query($args)ile değiştirebilirsiniz get_posts($args)ve çalışacaktır.
Bjorn

3
$products = wc_get_products(array(
    'category' => array('your-category-slug'),
));

OP özellikle bir kategori kimliği kullanarak ürün almayı istedi, ancak bu bana yardımcı oldu, bu yüzden nasıl olsa oy vereceğim. Sadece orijinal soruya cevap vermediğini unutmayın
dKen

2

kategoriyi (category-slug-name) kimliğe veya ada veya slug'a göre değiştirme

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

2

Biraz geç, ama bir şeyleri netleştirmek ve daha temiz bir cevap vermek istiyorum. Kullanıcı @ benz001 geçerli bir yanıt verdi, ancak yanlış bir şey söyledi: get_postsvarsayılan olarak postsyazı tipine varsayılan olarak her türlü yazı tipini döndürür WP_Query. İkisi arasındaki gerçek farklılıklar BURADA harika bir şekilde açıklanmıştır .

Gerçek şu ki, OP $argsdiziye bazı parametreleri eksikti :

  • Aradığı post tipinin tanımı:

        'post_type'             => 'product',
  • Ve arama sorgusunun "sınıflandırma kısmının" değiştirilmesi:

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

Bu şekilde sonraki satırlarınız

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

Size gerekli ürünleri gösterecektir :)

@ Benz001 tarafından gösterilen tüm diğer ek parametreler elbette geçerlidir ancak OP tarafından talep edilmemiştir, bu yüzden bunları bu cevapta geride bırakmaya karar verdim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.