将用户角色添加到生成的插件

时间:2021-03-09 作者:Leadhood

我使用JeremyHixon的生成器创建了一个选项页面,但该页面仅可供管理员用户访问。我想把这个提供给编辑。

我希望添加\\u角色,但我不确定如何实现这一点。非常感谢您的任何建议!

 * Generated by the WordPress Option Page generator
 * at http://jeremyhixon.com/wp-tools/option-page/
 */

class Example {
    private $example_options;

    public function __construct() {
        add_action( \'admin_menu\', array( $this, \'example_add_plugin_page\' ) );
        add_action( \'admin_init\', array( $this, \'example_page_init\' ) );
    }

    public function example_add_plugin_page() {
        add_menu_page(
            \'Example\', // page_title
            \'Example\', // menu_title
            \'manage_options\', // capability
            \'example\', // menu_slug
            array( $this, \'example_create_admin_page\' ), // function
            \'dashicons-admin-generic\', // icon_url
            2 // position
        );
    }

    public function example_create_admin_page() {
        $this->example_options = get_option( \'example_option_name\' ); ?>

        <div class="wrap">
            <h2>Example</h2>
            <p>some description</p>
            <?php settings_errors(); ?>

            <form method="post" action="options.php">
                <?php
                    settings_fields( \'example_option_group\' );
                    do_settings_sections( \'example-admin\' );
                    submit_button();
                ?>
            </form>
        </div>
    <?php }

    public function example_page_init() {
        register_setting(
            \'example_option_group\', // option_group
            \'example_option_name\', // option_name
            array( $this, \'example_sanitize\' ) // sanitize_callback
        );

        add_settings_section(
            \'example_setting_section\', // id
            \'Settings\', // title
            array( $this, \'example_section_info\' ), // callback
            \'example-admin\' // page
        );

        add_settings_field(
            \'text_label_0\', // id
            \'text-label\', // title
            array( $this, \'text_label_0_callback\' ), // callback
            \'example-admin\', // page
            \'example_setting_section\' // section
        );
    }

    public function example_sanitize($input) {
        $sanitary_values = array();
        if ( isset( $input[\'text_label_0\'] ) ) {
            $sanitary_values[\'text_label_0\'] = sanitize_text_field( $input[\'text_label_0\'] );
        }

        return $sanitary_values;
    }

    public function example_section_info() {
        
    }

    public function text_label_0_callback() {
        printf(
            \'<input class="regular-text" type="text" name="example_option_name[text_label_0]" id="text_label_0" value="%s">\',
            isset( $this->example_options[\'text_label_0\'] ) ? esc_attr( $this->example_options[\'text_label_0\']) : \'\'
        );
    }

}
if ( is_admin() )
    $example = new Example();

/* 
 * Retrieve this value with:
 * $example_options = get_option( \'example_option_name\' ); // Array of All Options
 * $text_label_0 = $example_options[\'text_label_0\']; // text-label
 */

1 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

如果您查看文档add_menu_page(), 您将看到第三个参数是:

向用户显示此菜单所需的功能。

在WordPress中,权限不需要特定的角色,您需要capability, 角色是功能的集合。您的菜单页需要manage_options, 默认情况下仅由管理员持有。如果还希望允许访问编辑器,则edit_pages 是仅由管理员和编辑拥有的功能。

add_menu_page(
    \'Example\', // page_title
    \'Example\', // menu_title
    \'edit_pages\', // capability
    \'example\', // menu_slug
    array( $this, \'example_create_admin_page\' ), // function
    \'dashicons-admin-generic\', // icon_url
    2 // position
);
现在,对于角色为edit_pages 功能,默认情况下只有管理员和编辑器。

但你会遇到另一个问题。您的管理页面包含使用创建的设置字段Settings API. 默认情况下,无论用于添加管理菜单项的功能如何,manage_options 需要提交设置表单。

要解决此问题,您需要使用option_page_capability_{$option_page} 滤器使用此筛选器,您可以更改提交设置页面所需的功能。你只需要更换{$option_page} 使用传递给的值settings_fields() (令人沮丧的是,这是选项组,而不是选项页)。

add_filter(
    \'option_page_capability_example_option_group\',
    function() {
        return \'edit_pages\';
    }
);