最近我不得不处理同样的问题。我使用user_has_cap
筛选以允许动态访问。
add_filter(\'user_has_cap\', \'editor_allow_edit_menu\', 10, 4);
function editor_allow_edit_menu($allcaps, $caps, $args, $user) {
if ( ! isset( $allcaps[\'editor\'] ) || true !== $allcaps[\'editor\'] ) {
return $allcaps;
}
global $pagenow;
// new items are added to the menu with ajax
// you could perhaps also check here that the ajax action is \'add-menu_item\' from $_POST
if ( wp_doing_ajax() || \'nav-menus.php\' === $pagenow ) {
$allcaps[\'edit_theme_options\'] = true;
}
return $allcaps;
}
上面的代码允许用户访问菜单编辑页面并向菜单添加新项目,这是通过管理ajax操作实现的。但是,这不会显示指向编辑页面的链接。为此,我在管理菜单中添加了一个自定义链接。
add_action( \'admin_menu\', \'add_nav_menus_link_for_editor\' );
function add_nav_menus_link_for_editor() {
if ( ! current_user_can(\'editor\') ) {
return;
}
// Custom link to the nav menus page
add_menu_page(
__(\'Menus\'),
__(\'Menus\'),
\'edit_others_posts\',
\'?options=nav-menus.php\', // I didn\'t get \'nav-menus.php\' working directly here and didn\'t bother figuring out why
\'\',
\'dashicons-menu\',
90
);
// remove themes menu page, would be visible otherwise when user is on menu editing page and has the edit_theme_options capability
remove_menu_page(\'themes.php\');
}
因为我没有
nav-menus.php
直接在上使用时工作
add_menu_page()
作为页面slug,我添加了快速而脏的重定向开关(quick and dirty redirect switcheroo),以便在单击自定义菜单链接时将用户引导到菜单编辑页面。
add_action(\'admin_init\', \'redirect_to_nav_menu_page\');
function redirect_to_nav_menu_page() {
if ( current_user_can(\'editor\') && isset($_GET[\'options\']) && \'nav-menus.php\' === $_GET[\'options\'] ) {
wp_redirect( admin_url( \'nav-menus.php\' ) );
die;
}
}
我认为这种访问方式更加有限,因为只有在使用一个特定的管理页面时才能设置该功能。尝试直接访问任何其他设置页面将导致功能错误通知。
这是我使用的代码的简化版本。最初,我有一个奇特的循环,允许编辑器基于一个配置数组访问其他几个设置页面。