如何让get_available_variations()循环遵循属性默认显示顺序?
解决WooCommerce变体循环与下拉框排序一致的问题
你遇到的情况是:$product->get_available_variations()默认按后台拖拽的变体顺序返回数据,但前端下拉框会遵循属性设置的排序规则(比如你设置的“名称”排序),导致两者排序不一致。
要让循环的变体排序和下拉框完全匹配,可以手动对变体数组按照属性的排序规则重新排序,代码示例如下:
$product = wc_get_product(get_the_ID()); // 获取原始可用变体数据 $variations = $product->get_available_variations(); // 获取产品属性的排序规则 $attributes = $product->get_attributes(); foreach ($attributes as $attr) { // 匹配属性设置的排序方式 if ($attr->get_orderby() === 'name') { // 按属性选项名称排序 usort($variations, function($a, $b) use ($attr) { $attr_slug = $attr->get_name(); $a_attr_val = $a['attributes']['attribute_' . $attr_slug]; $b_attr_val = $b['attributes']['attribute_' . $attr_slug]; // 将属性slug转换为对应的选项名称 $a_term = get_term_by('slug', $a_attr_val, 'pa_' . $attr_slug); $b_term = get_term_by('slug', $b_attr_val, 'pa_' . $attr_slug); return strcmp($a_term->name, $b_term->name); }); break; } elseif ($attr->get_orderby() === 'menu_order') { // 按属性选项的后台拖拽顺序排序(若需要匹配该规则) usort($variations, function($a, $b) use ($attr) { $attr_slug = $attr->get_name(); $a_attr_val = $a['attributes']['attribute_' . $attr_slug]; $b_attr_val = $b['attributes']['attribute_' . $attr_slug]; $a_term = get_term_by('slug', $a_attr_val, 'pa_' . $attr_slug); $b_term = get_term_by('slug', $b_attr_val, 'pa_' . $attr_slug); return $a_term->menu_order - $b_term->menu_order; }); break; } } // 循环输出排序后的变体 foreach ( $variations as $variation ) { ?> <li> <img src="<?php echo esc_url($variation['image']['url']); ?>" alt="<?php echo esc_attr($variation['image']['alt']); ?>" /> </li> <?php } ?>
代码说明
- 先获取产品的原始可用变体数据
- 读取产品属性的排序设置,匹配你在后台配置的排序规则
- 使用
usort函数对变体数组重新排序,确保和下拉框的排序逻辑一致 - 循环输出排序后的变体内容
内容的提问来源于stack exchange,提问作者Mathew Smith
相关产品推荐
相关产品推荐

