WooCommerce存档页显示在售变体属性时短名称问题求助
修复WooCommerce商店页变体属性显示短名称问题
问题说明
在WooCommerce商店页面显示有库存的产品变体属性时,现有代码可实现功能,但显示的是属性短名称(slug)而非友好的正式名称,视觉效果不佳。
原代码问题点
遍历变体属性时直接使用$attr_value获取的是属性的短名称,未转换为用户可见的正式名称。
修改后的代码
add_action( 'woocommerce_after_shop_loop_item', 'display_loop_item_stock_notice', 90 ); function display_loop_item_stock_notice() { global $product, $wpdb; $is_in_stock = $product->is_in_stock(); $backordered = $product->is_on_backorder(); // 处理变体产品 if($product->is_type('variable')) { $stock_qty = $wpdb->get_var(" SELECT SUM(pm.meta_value) FROM {$wpdb->prefix}posts as p JOIN {$wpdb->prefix}postmeta as pm ON p.ID = pm.post_id WHERE p.post_type = 'product_variation' AND p.post_status = 'publish' AND p.post_parent = '".get_the_id()."' AND pm.meta_key = '_stock' AND pm.meta_value IS NOT NULL"); // 有库存的变体 if($stock_qty > 0) { echo '<span style="color:green; font-weight:bold;"> Opcje dostępne z magazynu:</span></br>'; foreach ( $product->get_available_variations() as $key ) { $variation = wc_get_product( $key['variation_id'] ); $stock_quantity = $variation->get_stock_quantity(); if($variation->is_in_stock() && $stock_quantity > 0) { $attr_string = array(); foreach ( $key['attributes'] as $attr_name => $attr_value ) { // 移除属性名称前缀,获取对应分类法 $taxonomy = str_replace('attribute_', '', $attr_name); // 根据短名称获取属性正式名称 $term = get_term_by('slug', $attr_value, $taxonomy); $attr_string[] = $term ? $term->name : $attr_value; } echo '<span style="color:green;">'. implode( ', ', $attr_string ). ': ' . $stock_quantity. ' sztuk</span> </br>'; } } } // 无库存情况 else { echo $backordered !== 'no' && $stock_qty <= 0 ? '<span style="color:#33b0c7; "> Dostępny na zamówienie </span>' : '<span style="color:red;"> Brak w magazynie</span>'; } } }
修改说明
- 遍历变体属性时,通过
str_replace('attribute_', '', $attr_name)移除属性名称前缀,得到对应的产品属性分类法 - 使用
get_term_by('slug', $attr_value, $taxonomy)根据属性短名称(slug)获取术语对象,取出用户可见的正式名称$term->name - 增加容错逻辑:若无法获取到术语对象,仍保留原短名称作为备选,避免显示异常
内容的提问来源于stack exchange,提问作者Luiza Gojawiczyńska
相关产品推荐
相关产品推荐

