我找不到正确的方法来获取给定类别ID(而非类别名称)的所有产品的列表。

我用来获取类别列表的代码如下,它可以正常工作很好:

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

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


但是,现在对于给定的类别ID(例如47),我找不到找到相关产品的方法。我尝试了以下方法:

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

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


调试$products数组总是返回0,这是错误的,因为我知道ID为47的类别下有一些产品。修复我的代码?

评论

类别还是product_category?

#1 楼

我怀疑主要问题是您应该使用WP_Query对象而不是get_posts()。默认情况下,后者仅返回post_type为post的商品,而不返回产品,

,因此,给定ID为26的类别,以下代码将返回其商品(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中,可见性存储为元字段,因此代码为:

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


这里仅返回可见产品,每页12个。

浏览一下http://codex.wordpress.org/Class_Reference/WP_Query#Taxonomy_Parameters,以了解有关类别定位的工作原理的更多详细信息-通过Slug检索比按ID检索通常更有用!

评论


解决方案有效。很好的解释。

–Kamesh Jungi
15年7月10日在6:26

从Woocommerce 3开始,可见性更改为分类而不是meta,因此您需要将meta_query更改为tax_query。参见wordpress.stackexchange.com/a/262628/37355。

– jarnoan
17-10-18在7:10

您对get_posts()的结论是错误的。您可以在代码中用get_posts($ args)替换新的WP_Query($ args),它将起作用。

–比约恩
18年7月14日在9:43

#2 楼

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


评论


OP专门要求使用类别ID来获取产品,但是,这对我有所帮助,因此无论如何我都会投票。请注意,它不能回答原始问题

– dKen
19-09-24在17:34

#3 楼

通过id或name或slug更改类别(category-slug-name)

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


#4 楼

有点晚了,但想澄清一下事情并提供更干净的答案。用户@ benz001提供了可能的有效答案,但说错了:get_posts返回任何类型的post-type,默认为posts post-type,就像WP_Query一样。两者之间真正的区别在这里得到了很好的解释。 >他要搜索的帖子类型的定义:

    'post_type'             => 'product',



以及对搜索查询的“分类部分”的修改:

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



这样,您的下一行

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


将向您展示所需的产品:)

@ benz001显示的所有其他附加参数当然是有效的,但OP并没有要求,因此我决定在此答案中将其保留。

#5 楼

通过使用get_posts wordpress函数
按类别获取所有WooCommerce产品ID
在下面的代码中,只需添加类别名称及其工作。
$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', /*category name*/
        'operator' => 'IN',
        )
     ),
  ));
  foreach ( $all_ids as $id ) {
     echo $id;
  }