Magento 2:如何将自定义属性值作为菜单项标签显示?
Magento 2 主菜单显示分类自定义菜单标题属性而非分类标题
前提确认
先确保你创建的自定义属性(比如属性代码为menu_title)已正确配置:
- 在后台属性设置的「Storefront Properties」中,勾选「Used in Navigation Menu」(若有该选项)
- 确保属性已分配到对应属性集,且目标分类已填写该属性的值
步骤1:让分类集合加载自定义属性
为了让菜单能获取到自定义属性值,需要让分类集合加载该属性。创建自定义模块的etc/di.xml文件(无自定义模块建议新建一个简单模块):
<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <type name="Magento\Catalog\Model\ResourceModel\Category\Collection"> <plugin name="add_menu_title_to_category_collection" type="Vendor\CustomMenu\Plugin\CategoryCollectionPlugin" /> </type> </config>
然后创建插件类Vendor\CustomMenu\Plugin\CategoryCollectionPlugin.php:
<?php namespace Vendor\CustomMenu\Plugin; class CategoryCollectionPlugin { public function beforeLoad(\Magento\Catalog\Model\ResourceModel\Category\Collection $subject) { // 将自定义属性加入集合查询 $subject->addAttributeToSelect('menu_title'); return null; } }
步骤2:修改主题菜单模板文件
找到当前主题的topmenu.phtml模板,路径通常为app/design/frontend/[主题厂商]/[主题名]/Magento_Theme/templates/html/topmenu.phtml
找到输出菜单名称的代码段(一般是$child->getName()相关),替换为以下代码:
<?php // 获取菜单绑定的分类对象 $category = $child->getData('category'); // 优先使用自定义菜单标题,为空则 fallback 到原分类名称 $displayTitle = $category && $category->getMenuTitle() ? $category->getMenuTitle() : $child->getName(); ?> <?= $block->escapeHtml($displayTitle) ?>
步骤3:清理缓存
执行以下命令清除缓存,确保修改生效:
php bin/magento cache:clean php bin/magento cache:flush
补充说明
- 若使用第三方主题,菜单模板路径可能不同,可通过主题文件结构查找
topmenu.phtml - 不想创建模块的话,也可通过事件观察者加载属性,但插件方式更高效可控
内容的提问来源于stack exchange,提问作者nitinjohnson
相关产品推荐
相关产品推荐

