如何在WordPress自定义Nav Walker的end_lvl函数中获取当前分类名称?
要解决end_lvl函数里固定分类的问题,核心是在菜单遍历过程中存储当前菜单项对应的产品分类信息,在end_lvl触发时调用。具体实现步骤如下:
1. 在自定义Nav Walker类中添加分类存储属性
在你的自定义Nav Walker类里,新增一个私有属性用来临时保存当前产品分类的slug:
class Your_Custom_Nav_Walker extends Walker_Nav_Menu { // 新增属性,临时存储当前产品分类的slug private $current_cat_slug = ''; // ... 保留你已有的其他方法(如start_lvl、start_el等) }
2. 在start_el方法中捕获当前产品分类信息
修改start_el方法,当遍历到WooCommerce产品分类菜单项时,提取其分类slug并保存到上述属性中:
function start_el(&$output, $item, $depth = 0, $args = null, $id = 0) { // 保留你原本的start_el业务代码... // 判断当前菜单项是否为产品分类 if ($item->object === 'product_cat') { $term = get_term($item->object_id, 'product_cat'); $this->current_cat_slug = $term->slug; } else { // 非产品分类菜单,清空存储的slug $this->current_cat_slug = ''; } // 保留你原本的start_el剩余代码... }
3. 修改end_lvl方法,动态使用当前分类slug
替换原end_lvl中的固定分类参数,改为使用存储的分类slug,同时增加判断避免非分类菜单执行无效查询:
function end_lvl(&$output, $depth=0, $args=null) { $indent = str_repeat( "\t", $depth ); $divder_div_start = "<div class=\"megamenu-divder\">"; $divder_div_end = "</div>"; $topseller_img_tags = ''; // 仅当存在有效分类slug时执行产品查询 if (!empty($this->current_cat_slug)) { $query = new WC_Product_Query( array( 'limit' => 4, 'orderby' => 'date', 'order' => 'DESC', 'return' => 'ids', 'category' => array( $this->current_cat_slug ), ) ); $products = $query->get_products(); foreach($products as $p_id){ $image = wp_get_attachment_image_src( get_post_thumbnail_id( $p_id )); // 增加图片存在性判断,避免无图时出现PHP警告 if ($image) { $topseller_img_tags .= "\n<div><img src='$image[0]' width='150' height='150' /></div>"; } } } $topseller_div_start = "<div class=\"top-seller-megamenu\">"; $topseller_div_end = "</div>"; if($depth > 0) { $output .= "$indent</ul>\n$indent\n$divder_div_start\n$divder_div_end\n$topseller_div_start\n$topseller_img_tags\n$topseller_div_end\n</section>\n"; } else { $output .= "</ul>"; } }
额外说明
- 确保你的自定义Nav Walker类正确继承
Walker_Nav_Menu,并且在注册菜单时指定使用该Walker。 - 新增的图片存在性判断可以避免产品无特色图片时产生PHP警告。
- 非产品分类菜单会自动跳过产品查询逻辑,减少无效数据库请求。
内容的提问来源于stack exchange,提问作者Sepehr Mahvash
相关产品推荐
相关产品推荐

