将菜单项添加到WordPress管理栏,以便编辑人员编辑某个插件的设置

时间:2018-11-10 作者:Liz

我在我客户的WordPress网站上安装了Siteimprove插件,我需要提供对该插件的编辑器访问权限。默认情况下,编辑器无权访问插件。我试图将以下内容添加到functions.php:

if (!current_user_can(\'manage_options\')) {
  add_menu_page(
        \'Siteimprove Plugin\',
        \'Siteimprove\',
        \'manage_options\',
        \'siteimprove\',
        \'siteimprove_settings_form\'
    );
}
这是将Siteimprove插件添加到菜单的代码:

/**
 * Register menu for settings form page.
 */
public function register_menu() {
    // Add top level menu page.
    add_menu_page(
        __(\'Siteimprove Plugin\'),
        __(\'Siteimprove\'),
        \'manage_options\',
        \'siteimprove\',
        \'Siteimprove_Admin_Settings::siteimprove_settings_form\'
    );
}
我创建了一个测试编辑器帐户,但这不起作用。我是不是错过了一些让这一切正常运转的东西?谢谢你的帮助!

2 个回复
SO网友:Quang Hoang

我已经阅读了关于此函数的,我看到您需要参数capability 允许用户将菜单视为admineditor.

阅读更多函数以了解详细信息:https://developer.wordpress.org/reference/functions/add_menu_page/

您可以使用以下代码来尝试此操作。

/**
 * Register menu for settings form page.
 */
public function register_menu() {
    // Add top level menu page.
    add_menu_page(
        __(\'Siteimprove Plugin\'),
        __(\'Siteimprove\'),
        \'edit_posts\',//change this line \'manage_options\' to \'edit_posts\'
        \'siteimprove\',
        \'Siteimprove_Admin_Settings::siteimprove_settings_form\'
    );
}
我希望它对你有用。祝你好运

SO网友:Tim Elsass

添加菜单项时,会对“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 并将其作为插件安装,以便根据自己的需要进行进一步的测试和修改。

结束

相关推荐