wc_get_products无法返回全部商品,如何获取所有WooCommerce商品?
我使用以下代码尝试获取所有WooCommerce商品:
$args = array( 'limit' => -1, // 尝试获取所有商品 'return' => 'ids' // 仅获取ID以优化性能;移除该参数可获取完整商品对象 ); $product_ids = wc_get_products($args); echo "<pre>"; print_r($product_ids); echo "</pre>";输出仅包含4个商品ID,但实际WooCommerce中有9个商品。单独用
wc_get_product查询ID为620的商品可正常获取信息,对该商品执行快速编辑更新后,它会出现在查询结果中,但仍未返回全部商品。未发现这类商品与已返回商品有显著差异,请问如何让wc_get_products返回全部商品?
解决方法
1. 包含所有商品状态
wc_get_products默认只抓取**已发布(publish)**状态的商品,草稿、待审核、私密或回收站的商品不会被返回。添加status参数指定所有状态即可:
$args = array( 'limit' => -1, 'return' => 'ids', 'status' => 'any' // 匹配所有商品状态 );
也可以指定具体状态数组,比如array('publish', 'draft', 'pending')。
2. 禁用查询缓存
编辑商品后能正常显示,说明大概率是WooCommerce的查询缓存导致旧数据未更新。在参数中添加cache字段强制禁用缓存:
$args = array( 'limit' => -1, 'return' => 'ids', 'cache' => false );
也可以在WooCommerce后台「状态 > 工具」中点击「清除临时数据」手动清理缓存。
3. 排查第三方过滤钩子
部分主题或插件会通过woocommerce_product_query_args或woocommerce_product_query钩子修改查询条件,导致商品被过滤。可以临时切换到默认主题(如Storefront)并禁用所有非WooCommerce插件,测试查询是否正常。如果恢复,再逐个排查插件和主题代码。
4. 显式指定所有产品类型
如果你的商品包含变体、分组等特殊类型,默认查询可能未覆盖。显式指定产品类型确保全部包含:
$args = array( 'limit' => -1, 'return' => 'ids', 'type' => array('simple', 'variable', 'grouped', 'external', 'subscription') );
5. 用WP_Query直接查询(备用方案)
如果以上方法都无效,可绕过wc_get_products,直接使用WP_Query获取所有产品ID:
$query = new WP_Query(array( 'post_type' => 'product', 'post_status' => 'any', 'posts_per_page' => -1, 'fields' => 'ids' )); $product_ids = $query->posts; echo "<pre>"; print_r($product_ids); echo "</pre>";
内容的提问来源于stack exchange,提问作者Albert van Harten

