
本文详解如何在 woocommerce 中根据 `old_id` 自定义字段值精准查询对应的产品分类(product_cat)id,纠正 `get_categories()` 不适用及 `wp_query` 误用的问题,提供正确、高效、可复用的 `get_terms()` 解决方案。
WooCommerce 的产品分类(Product Categories)本质上是自定义分类法(taxonomy)product_cat,而非 WordPress 默认的 category。因此,不能使用 get_categories()(该函数仅支持内置分类法),也不能在 WP_Query 中对分类本身进行元字段查询——因为 tax_query 用于筛选“属于某分类的文章”,而非“按元数据查找分类项”。
正确的方式是使用 WordPress 核心函数 get_terms(),并显式指定 ‘taxonomy’ => ‘product_cat’,同时利用其原生支持的 meta_key 和 meta_value 参数(注意:这是 get_terms() 自 4.6+ 起支持的简写形式,比嵌套 meta_query 更简洁可靠):
function wc_get_product_category_by_old_id( $old_cat_id ) {
$terms = get_terms(
array(
'taxonomy' => 'product_cat',
'meta_key' => 'old_id',
'meta_value' => $old_cat_id,
'hide_empty' => false,
'number' => 1, // 确保最多返回一个(避免重复 old_id 导致歧义)
'fields' => 'ids', // 直接返回 ID 数组,轻量高效
)
);
// 检查是否出错或无结果
if ( is_wp_error( $terms ) || empty( $terms ) ) {
return 0;
}
return (int) $terms[0];
}
// 使用示例:
$old_id = 123;
$new_cat_id = wc_get_product_category_by_old_id( $old_id );
if ( $new_cat_id ) {
echo "新分类 ID 为:{$new_cat_id}";
} else {
echo "未找到匹配的分类(old_id = {$old_id})";
}
✅ 关键要点说明:
- ✅ 必须指定 ‘taxonomy’ => ‘product_cat’;否则 get_terms() 默认操作 category。
- ✅ meta_key + meta_value 是 get_terms() 的合法参数(无需复杂 meta_query 数组),语义清晰且兼容性好。
- ✅ 添加 ‘number’ => 1 可防多匹配冗余,’fields’ => ‘ids’ 避免加载完整对象,提升性能。
- ❌ WP_Query 的 tax_query 无法查询分类元数据——它只作用于文章与分类的关联关系。
- ❌ get_categories() 完全不支持自定义分类法,调用将静默失败或返回空数组。
? 进阶建议:
如需批量映射或迁移场景,可配合 wp_cache_set() 缓存结果,避免高频重复查询;若 old_id 存在重复,建议在数据库层面添加唯一索引约束,确保业务逻辑健壮性。