我用来获取类别列表的代码如下,它可以正常工作很好:
$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的类别下有一些产品。修复我的代码?#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;
}
评论
类别还是product_category?