WooCommerce 如何根据产品获取分类 ID?
2024-12-20 23:37:46
WooCommerce:如何通过产品获取分类 ID?
在开发 WooCommerce 相关功能时,需要获取订单中每个产品所属分类的 ID。订单信息本身并不直接包含分类 ID。面对这样的场景,我们该如何处理?本文提供多种可行方案,让问题迎刃而解。
问题概述
使用 WC_Order
的 get_items()
方法获取订单商品后,只能直接访问产品的基础信息,如:产品 ID、名称、数量、价格等。需要利用这些信息作为桥梁,进一步获取分类 ID。
解决方案
以下介绍三种可用于通过产品获取分类 ID 的方法。
方案一:使用 wc_get_product_category_list
函数
wc_get_product_category_list
是 WooCommerce 提供的一个简便函数,专门用于获取产品的分类列表。这个函数可以直接返回产品分类的逗号分隔字符串。对返回的字符串再做解析,即得分类ID。
操作步骤
- 获取订单商品。
- 遍历订单中的每一个商品。
- 获取每个商品的产品 ID。
- 利用
wc_get_product_category_list
函数,获取该产品分类。 - 通过字符串查找,获取到分类 ID。
代码示例
$order = new WC_Order( $order_id );
$items = $order->get_items();
$category_ids = array();
foreach ( $items as $item ) {
$product_id = $item->get_product_id();
$terms = get_the_terms( $product_id, 'product_cat');
if (!empty($terms) && !is_wp_error($terms)){
foreach ($terms as $term) {
$category_ids[] = $term->term_id;
}
}
}
// 对分类ID $category_ids 进行需要的判断。
安全说明:在执行获取产品分类前,请确认该分类为合法名称。
方案二:使用 get_the_terms
函数
get_the_terms
是 WordPress 内置函数,可用于获取指定文章所属的所有分类、标签。虽然不是 WooCommerce 专属函数,但同样能胜任获取产品分类的需求。该方法较直接通过ID解析出分类 ID。
操作步骤
- 获取订单商品。
- 遍历订单中的每一个商品。
- 获取每个商品的产品 ID。
- 利用
get_the_terms
函数,结合 'product_cat' 分类法,获取分类信息。 - 从分类信息中提取分类 ID。
代码示例
$order = new WC_Order( $order_id );
$items = $order->get_items();
$category_ids = array();
foreach ( $items as $item ) {
$product_id = $item->get_product_id();
$terms = get_the_terms( $product_id, 'product_cat' );
if ( is_array( $terms ) ) {
foreach ( $terms as $term ) {
$category_ids[] = $term->term_id;
}
}
}
// $category_ids 现在包含每个产品的分类 ID
//后续逻辑代码,可根据业务需求操作 category_ids
安全提示 : 当get_the_terms
函数未找到对应的分类,可能导致数组越界等异常,需要额外做检查,例如通过 !empty()
判断是否获得非空值。
方案三:直接使用 WordPress 查询语句
通过构建自定义的 WordPress 查询,可以深入 WordPress 数据库查询数据。这提供了极大的灵活性,尤其在处理复杂数据关系时。
操作步骤
- 获取订单中的所有产品 ID。
- 利用 WP_Query 对象或 $wpdb 对象构建查询,查询关联产品分类法的中间表。
- 根据
object_id
,获取对应的产品分类term_taxonomy_id
和term_id
。 - 组装分类 ID 数组。
代码示例
global $wpdb;
$order = new WC_Order( $order_id );
$items = $order->get_items();
$product_ids = array();
$category_ids = array();
foreach ( $items as $item ) {
$product_ids[] = $item->get_product_id();
}
$product_ids_string = implode(',', $product_ids);
$results = $wpdb->get_results( "
SELECT tr.object_id, tt.term_id
FROM {$wpdb->term_relationships} AS tr
INNER JOIN {$wpdb->term_taxonomy} AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
WHERE tt.taxonomy = 'product_cat'
AND tr.object_id IN ($product_ids_string)
" );
if (!empty($results)){
foreach( $results as $result ) {
$category_ids[] = $result->term_id;
}
}
// $category_ids 即是所需数组
// 后续可继续对 $category_ids 做校验处理
安全提示: 直接执行SQL查询有潜在SQL注入风险,切记参数化所有输入内容,务必通过正规的数据验证途径来执行操作。
选择建议
对于需要快速获得产品分类的情形,建议使用 get_the_terms
函数。它简洁,高效,适用于大多数场景。
需要深度定制或在获取信息时关联其它查询任务的开发者,更倾向于使用最后一种方法。虽然实现更复杂,但它在应对复杂查询条件时会提供更大自由度。
不管采取何种方式,我们均需要关注:数据验证及预防安全漏洞。通过了解具体场景及需求,可以选择高效安全的办法来获取到所需要的数据。