如何为WordPress页面创建自定义属性以指定显示菜单
嘿,这个需求其实挺常见的,我给你几个可行的方案,从原生无插件到可视化插件都有,你可以根据自己的技术能力来选:
方案1:用WordPress原生自定义字段(无需插件)
这个是最基础的方法,不用装任何插件,完全靠WordPress自带功能实现:
- 首先打开页面编辑界面,点击右上角的「选项」(就是那个齿轮图标),在弹出的面板里勾选「自定义字段」,这样页面底部就会显示自定义字段区域了。
- 点击「添加自定义字段」,键(Key)填个好记的名字,比如
selected_menu,值(Value)填你要选的菜单的Slug(比如你创建的Menu 1的slug是menu-1,就填这个)。如果不知道菜单slug,去「外观」→「菜单」,点击对应的菜单名称,地址栏里的menu=xxx后面的xxx就是slug。 - 接下来修改主题里的菜单调用代码(一般是
header.php或者专门的菜单模板文件),替换原来的wp_nav_menu()代码:
// 获取当前页面设置的自定义字段值 $selected_menu = get_post_meta(get_the_ID(), 'selected_menu', true); // 如果有设置值,就显示对应的菜单,否则显示默认菜单 if (!empty($selected_menu)) { wp_nav_menu(array( 'menu' => $selected_menu, 'container' => false, // 这里可以保留你原来的菜单容器设置 'menu_class' => 'your-menu-class' // 替换成你主题里的菜单类名 )); } else { // 显示默认菜单,比如你的默认菜单slug是'primary-menu' wp_nav_menu(array('menu' => 'primary-menu')); }
- 保存修改后,回到页面编辑页,更新页面就能看到对应的菜单了。
方案2:自定义元框(更友好的后台选择体验)
如果觉得手动输slug太麻烦,可以自己写个小功能,在页面编辑页加个下拉菜单直接选已有菜单,体验更好:
把下面的代码加到你的主题子主题的functions.php里(一定要用子主题,不然主题更新会丢代码):
// 注册自定义元框 add_action('add_meta_boxes', 'add_menu_selector_meta_box'); function add_menu_selector_meta_box() { add_meta_box( 'menu_selector', // 元框ID '选择要显示的菜单', // 元框标题 'render_menu_selector_meta_box', // 渲染元框的函数 'page', // 要显示在页面类型 'side', // 显示位置(侧边栏) 'default' // 优先级 ); } // 渲染元框内容(下拉菜单) function render_menu_selector_meta_box($post) { // 获取已保存的菜单值 $saved_menu = get_post_meta($post->ID, 'selected_menu', true); // 获取所有WordPress菜单 $menus = get_terms('nav_menu', array('hide_empty' => false)); // 添加安全验证字段 wp_nonce_field('save_menu_selector', 'menu_selector_nonce'); echo '<label for="selected_menu">选择菜单:</label>'; echo '<select id="selected_menu" name="selected_menu">'; echo '<option value="">-- 选择菜单 --</option>'; foreach ($menus as $menu) { $selected = ($menu->slug == $saved_menu) ? 'selected' : ''; echo '<option value="' . esc_attr($menu->slug) . '" ' . $selected . '>' . esc_html($menu->name) . '</option>'; } echo '</select>'; } // 保存元框数据 add_action('save_post', 'save_menu_selector_meta_box_data'); function save_menu_selector_meta_box_data($post_id) { // 检查验证字段是否有效 if (!isset($_POST['menu_selector_nonce']) || !wp_verify_nonce($_POST['menu_selector_nonce'], 'save_menu_selector')) { return; } // 检查用户权限 if (!current_user_can('edit_post', $post_id)) { return; } // 检查是否是自动保存 if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) { return; } // 保存数据 if (isset($_POST['selected_menu'])) { update_post_meta($post_id, 'selected_menu', sanitize_text_field($_POST['selected_menu'])); } else { delete_post_meta($post_id, 'selected_menu'); } }
然后还是用方案1里的主题调用代码,这样后台页面编辑页的侧边栏就会出现一个下拉菜单,直接选Menu 1/2/3就行,不用记slug了。
方案3:用ACF插件(可视化操作,适合非技术用户)
如果你不想写代码,用Advanced Custom Fields(ACF)插件是最省心的:
- 安装并激活ACF插件(WordPress插件库直接搜就能找到)。
- 进入「自定义字段」→「添加字段组」:
- 字段组名称填「页面菜单选择」,规则设置为「显示在 页面 等于 所有页面」。
- 添加一个字段,字段类型选「菜单」,字段名称填
selected_menu,标签填「选择要显示的菜单」。
- 保存字段组后,回到页面编辑页,就能看到这个菜单选择字段了,直接选对应的菜单就行。
- 主题里的调用代码改成:
$selected_menu = get_field('selected_menu'); if ($selected_menu) { wp_nav_menu(array('menu' => $selected_menu)); } else { // 显示默认菜单 wp_nav_menu(array('menu' => 'primary-menu')); }
最后提醒一下:不管用哪个方案,修改主题代码时一定要用子主题,避免主题更新后你的修改被覆盖。
内容的提问来源于stack exchange,提问作者user3810167
相关产品推荐
相关产品推荐

