添加菜单项时,会对“manage\\u options”进行功能检查。您需要将该权限更改为特定于编辑器的权限:
add_menu_page(
\'Siteimprove Plugin\',
\'Siteimprove\',
\'edit_others_pages\',
\'siteimprove\',
\'siteimprove_settings_form\'
);
您还从运行以生成页面的方法中删除了该类,因此应将其添加回第一个代码段中的状态:
add_menu_page(
\'Siteimprove Plugin\',
\'Siteimprove\',
\'edit_others_pages\',
\'siteimprove\',
\'Siteimprove_Admin_Settings::siteimprove_settings_form\'
);
您可以参考
WordPress Roles and Capabilities 在法典中获取更多深入信息。
在研究插件本身时,我不认为仅仅改变它就能解决您的问题,因为插件在其功能中还对管理员用户进行了其他检查。
我要采取的第一步是检查当前用户的角色,首先确保他们是您要为其提供菜单和访问权限的角色。要做到这一点,我会写下这样的内容:
function wpse_318816_get_current_user_role() {
if ( is_user_logged_in() ) {
$user = wp_get_current_user();
return in_array( \'editor\', $user->roles );
}
}
这使用WordPress方法
is_user_logged_in()
和
wp_get_current_user()
检查他们是否已登录,并获取用户对象。在用户对象中,有一个角色属性,其中包含一个可用角色数组。我们可以在此处检查当前用户的角色是否为编辑器,然后添加如下菜单:
// Adds the siteimprove menu for the editor role\'s capability.
function wpse_318816_add_editor_menu() {
if ( wpse_318816_get_current_user_role() ) {
add_menu_page(
\'Siteimprove Plugin\',
\'Siteimprove\',
\'edit_others_pages\',
\'siteimprove\',
\'Siteimprove_Admin_Settings::siteimprove_settings_form\'
);
}
}
add_action( \'admin_init\', \'wpse_318816_add_editor_menu\' );
这可以在编辑器的仪表板中添加菜单,但随后会遇到插件中使用的实际功能不起作用。此时,您最好的选择是在该页面上重新映射编辑器的功能。
为此,您可以使用map_meta_cap
filter, 并检查manage\\u选项是否用于您想要的特定案例。这可以防止编辑器在站点的其他地方拥有过多的访问权限,即管理员权限,而他们本应只是编辑器。使用筛选器,类似这样的内容应有助于允许编辑器角色具有的编辑\\u其他\\u页面的功能用于管理员的manage\\u选项功能:
// Remaps edit capability to the user role.
function wpse_318816_add_editor_cap( $caps = array(), $cap = \'\', $user_id = 0, $args = array() ) {
global $pagenow;
if ( $cap !== \'manage_options\' ) {
return $caps;
}
// Remove the filter to prevent resursive loops.
remove_filter( \'map_meta_cap\', \'wpse_318816_add_editor_cap\', 11 );
// Abort for admin.
if ( current_user_can( \'administrator\' ) ) {
return $caps;
}
if ( wpse_318816_get_current_user_role() ) {
// Check if you\'re on the adminpage for siteimprove.
if ( ( $pagenow === \'admin.php\' && $_GET[\'page\'] === \'siteimprove\' ) ||
// Check if you\'re submitting the token request form.
( $pagenow === \'options.php\' && $_POST[\'option_page\'] === \'siteimprove\' ) ) {
// Set caps to edit_others_pages for the editor role.
$caps = array( \'edit_others_pages\' );
// Re-add the filter.
add_filter( \'map_meta_cap\', \'wpse_318816_add_editor_cap\', 11, 4 );
// Remove the menu page as we are remapping manage_options to edit_others_pages.
remove_menu_page( \'siteimprove\' );
}
}
return $caps;
}
add_filter( \'map_meta_cap\', \'wpse_318816_add_editor_cap\', 11, 4 );
我看到的一个警告是,在这个特定的实例中,菜单项被重新添加,因此显示了两个菜单。为了解决这个问题,我刚刚删除了我们添加的自定义菜单,当用户是插件的页面等时,使用remove\\u menu\\u page()。
我建议将此代码用作插件,而不仅仅是在主题中添加内容functions.php
文件,这样您就不会丢失对更新等内容的更改。我继续说created a gist so you can view the full code. 您还可以download and install the .zip 并将其作为插件安装,以便根据自己的需要进行进一步的测试和修改。