如何修改WooCommerce查询代码获取相似SKU对应产品的颜色属性
WooCommerce 相似SKU产品同时获取颜色属性调整方案
前置修正
你当前代码存在笔误:函数定义时命名为 wc_get_products_sku_img,调用时写的是 wc_get_product_skus,需要先统一名称,否则会触发函数不存在的报错。
方案1:最小改动实现(兼容性更高,推荐)
无需修改现有查询函数,直接在循环中通过WooCommerce原生方法获取颜色属性即可,适配全局属性和自定义属性两种场景:
global $product; // 修正函数名和定义保持一致 $results = wc_get_products_sku_img('21.127.'); foreach ( $results as $result ) { $product_id = $result->id; $product_sku = $result->sku; $product = wc_get_product( $product_id ); // 场景1:颜色是全局属性,slug默认是pa_color,可根据你后台的实际slug替换 $colors = wc_get_product_terms( $product_id, 'pa_color', array( 'fields' => 'names' ) ); $color = !empty($colors) ? reset($colors) : '无颜色信息'; // 场景2:颜色是自定义产品属性,把下面注释打开,上面场景1的代码注释即可,'颜色'替换为你后台设置的属性名称 // $attributes = $product->get_attributes(); // $color_attr = isset($attributes['颜色']) ? $attributes['颜色'] : ''; // $color = $color_attr ? implode(',', $color_attr->get_options()) : '无颜色信息'; echo 'Sku Code :'. $product_sku . ' Color : ' . $color . '<br>'; }
方案2:优化SQL查询(性能更高,适合数据量大的场景)
直接修改查询函数,关联属性表一次性返回SKU、产品ID、颜色数据,避免循环中重复查询数据库:
第一步:修改functions.php中的查询函数
function wc_get_products_sku_img( $sku_excerpt ) { global $wpdb; return $wpdb->get_results( $wpdb->prepare( " SELECT p.ID as id, pm.meta_value as sku, t.name as color FROM {$wpdb->prefix}posts p INNER JOIN {$wpdb->prefix}postmeta pm ON p.ID = pm.post_id LEFT JOIN {$wpdb->prefix}term_relationships tr ON p.ID = tr.object_id LEFT JOIN {$wpdb->prefix}term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id AND tt.taxonomy = 'pa_color' LEFT JOIN {$wpdb->prefix}terms t ON tt.term_id = t.term_id WHERE p.post_type = 'product' AND p.post_status = 'publish' AND pm.meta_key = '_sku' AND pm.meta_value LIKE '%s' ", '%'.$sku_excerpt.'%' ) ); }
第二步:调用代码直接取返回的颜色字段
$results = wc_get_products_sku_img('21.127.'); foreach ( $results as $result ) { $color = !empty($result->color) ? $result->color : '无颜色信息'; echo 'Sku Code :'. $result->sku . ' Color : ' . $color . '<br>'; }
注意事项
- 代码里的属性slug/名称需要和你WooCommerce后台实际设置的颜色属性对应,否则会获取不到数据
- 如果单个产品绑定了多个颜色值,代码默认取第一个值/逗号拼接所有值,可根据你的展示需求自行调整逻辑
内容的提问来源于stack exchange,提问作者JFeel
相关产品推荐
相关产品推荐

