log1x / navi
WordPress NavWalker 的开发者友好替代品。
Requires
- php: ^8.0
Requires (Dev)
- laravel/pint: ^1.14
README
讨厌 WordPress NavWalker? 我也是。
Navi 是 NavWalker 的开发者友好替代品。使用模板/视图中的可迭代对象轻松构建 WordPress 菜单。
需求
- PHP >= 8.0
安装
Bedrock(或 Sage)
通过 Composer 安装
$ composer require log1x/navi
手动
下载最新版本 .zip 文件并安装到 wp-content/plugins
。
使用方法
查看 示例 文件夹以了解如何在项目中使用 Navi。
基本使用
<?php use Log1x\Navi\Navi; $navigation = Navi::make()->build('primary_navigation'); if ($navigation->isEmpty()) { return; } return $navigation->toArray();
在构建导航菜单时,Navi 保留菜单对象,并通过 get()
方法使其可用。
默认情况下,get()
返回原始 wp_get_nav_menu_object()
允许您直接访问它。
可选地,您可以传递一个 key
和 default
来调用特定的对象键,并提供回退值,使其为 null、空或未设置。
$navigation->get()->name; $navigation->get('name', 'My menu title');
Acorn 使用
如果您正在使用 Navi 与 Acorn(例如 Sage)一起使用,您可以使用 Acorn 的 CLI 生成可用的视图组件。
$ acorn make:navi
生成后,您可以在现有视图中使用 视图组件,如下所示:
<x-navigation />
访问页面对象
如果您的菜单项链接到页面对象(例如,不是自定义链接)- 您可以使用 objectId
属性检索页面 ID。
# Blade {{ get_post_type($item->objectId) }} # PHP <?php echo get_post_type($item->objectId); ?>
访问自定义字段
在需要访问直接附加到您的菜单项的自定义字段的情况下,您可以使用 id
属性检索菜单项 ID。
以下示例将获取使用 ACF 添加 到我们的菜单的标签覆盖字段 - 如果字段为空,则回退到默认菜单标签。
# Blade {{ get_field('custom_nav_label', $item->id) ?: $item->label }} # PHP <?php echo get_field('custom_nav_label', $item->id) ?: $item->label; ?>
示例输出
在调用 build()
时,Navi 将解析传递的导航菜单,并返回一个包含您的菜单项的流畅容器。要返回对象数组,只需调用 ->toArray()
。
默认情况下,build()
调用 primary_navigation
,这是 Sage 上的默认菜单主题位置。
array [ 5 => { +"active": true +"activeAncestor": false +"activeParent": false +"classes": "example" +"dbId": 5 +"description": false +"id": 5 +"label": "Home" +"object": "page" +"objectId": "99" +"parent": false +"slug": "home" +"target": "_blank" +"title": false +"type": "post_type" +"url": "https://sage.test/" +"xfn": false +"order": 1 +"parentObjectId": false +"children": false } 6 => { +"active": false +"activeAncestor": false +"activeParent": false +"classes": false +"dbId": 6 +"description": false +"id": 6 +"label": "Sample Page" +"object": "page" +"objectId": "100" +"parent": false +"slug": "sample-page" +"target": false +"title": false +"type": "post_type" +"url": "https://sage.test/sample-page/" +"xfn": false +"order": 2 +"parentObjectId": false +"children": array [ 7 => { +"active": false +"activeAncestor": false +"activeParent": false +"classes": false +"dbId": 7 +"description": false +"id": 7 +"label": "Example" +"object": "custom" +"objectId": "101" +"parent": 6 +"slug": "example" +"target": false +"title": false +"type": "custom" +"url": "#" +"xfn": false +"order": 3 +"parentObjectId": 100 +"children": array [ ... ] } ] } ]
话虽如此,根据您的菜单深度,您最终可以无限循环调用 ->children
。
错误报告
如果您在 Navi 中发现错误,请 提交问题。
贡献
无论是通过 PR、报告问题还是提出建议,都鼓励并感谢您的贡献。
许可协议
Navi 在 MIT 许可证 下提供。