返回

WooCommerce 如何根据产品获取分类 ID?

php

WooCommerce:如何通过产品获取分类 ID?

在开发 WooCommerce 相关功能时,需要获取订单中每个产品所属分类的 ID。订单信息本身并不直接包含分类 ID。面对这样的场景,我们该如何处理?本文提供多种可行方案,让问题迎刃而解。

问题概述

使用 WC_Orderget_items() 方法获取订单商品后,只能直接访问产品的基础信息,如:产品 ID、名称、数量、价格等。需要利用这些信息作为桥梁,进一步获取分类 ID。

解决方案

以下介绍三种可用于通过产品获取分类 ID 的方法。

方案一:使用 wc_get_product_category_list 函数

wc_get_product_category_list 是 WooCommerce 提供的一个简便函数,专门用于获取产品的分类列表。这个函数可以直接返回产品分类的逗号分隔字符串。对返回的字符串再做解析,即得分类ID。

操作步骤

  1. 获取订单商品。
  2. 遍历订单中的每一个商品。
  3. 获取每个商品的产品 ID。
  4. 利用 wc_get_product_category_list 函数,获取该产品分类。
  5. 通过字符串查找,获取到分类 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。

操作步骤

  1. 获取订单商品。
  2. 遍历订单中的每一个商品。
  3. 获取每个商品的产品 ID。
  4. 利用 get_the_terms 函数,结合 'product_cat' 分类法,获取分类信息。
  5. 从分类信息中提取分类 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 数据库查询数据。这提供了极大的灵活性,尤其在处理复杂数据关系时。

操作步骤

  1. 获取订单中的所有产品 ID。
  2. 利用 WP_Query 对象或 $wpdb 对象构建查询,查询关联产品分类法的中间表。
  3. 根据 object_id,获取对应的产品分类 term_taxonomy_idterm_id
  4. 组装分类 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 函数。它简洁,高效,适用于大多数场景。

需要深度定制或在获取信息时关联其它查询任务的开发者,更倾向于使用最后一种方法。虽然实现更复杂,但它在应对复杂查询条件时会提供更大自由度。

不管采取何种方式,我们均需要关注:数据验证及预防安全漏洞。通过了解具体场景及需求,可以选择高效安全的办法来获取到所需要的数据。