我希望能够授予编辑者更改菜单的权限,可以这样做吗?

外观标签似乎根本不是一个选项,我可以这样做吗?

#1 楼

将此添加到主题的functions.php中:
// add editor the privilege to edit theme

// get the the role object
$role_object = get_role( 'editor' );

// add $cap capability to this role object
$role_object->add_cap( 'edit_theme_options' );


更新(建议在注释中):

您可能不应该对每个请求都这样做,因为AFAIK会导致db
写入。仅在admin_init上更好,且仅当!$role_object->has_cap('edit_theme_options')


评论


get_role是一堂课吗?

–轻度绒毛
2011-2-24在13:31

@Mild Fuzz-本身不是,但它返回WP_Role的一个实例

–TheDeadMedic
2011年8月14日12:25



据我所知,您可能不应该对每个请求都执行此操作,因为这会导致数据库写入。最好在admin_init上使用,并且仅当!$ role_object-> has_cap('edit_theme_options')

– jsphpl
17年2月14日在9:14



此设置已保存到数据库(在表wp_options中的字段wp_user_roles中),因此最好在主题/插件激活时运行此设置。参见codex.wordpress.org/Function_Reference/add_cap

– Pim Schaaf
18年3月12日在16:46

或者您可以将其添加到functions.php中,运行一次,然后将其删除

– d79
19年1月16日在23:10

#2 楼

编辑:针对WP 4.9进行更新,并且仅隐藏编辑器的菜单项

如果您希望用户能够更改导航菜单,但不更改外观下的其他选项,请使用此

// Do this only once. Can go anywhere inside your functions.php file
$role_object = get_role( 'editor' );
$role_object->add_cap( 'edit_theme_options' );


刷新管理面板后,您可以注释掉整个代码,因为上述代码将对数据库进行持久更改。

您现在拥有外观上的所有选项对编辑者都是可见的。您可以像这样隐藏其他选项:

function hide_menu() {

    if (current_user_can('editor')) {

        remove_submenu_page( 'themes.php', 'themes.php' ); // hide the theme selection submenu
        remove_submenu_page( 'themes.php', 'widgets.php' ); // hide the widgets submenu
        remove_submenu_page( 'themes.php', 'customize.php?return=%2Fwp-admin%2Ftools.php' ); // hide the customizer submenu
        remove_submenu_page( 'themes.php', 'customize.php?return=%2Fwp-admin%2Ftools.php&autofocus%5Bcontrol%5D=background_image' ); // hide the background submenu


        // these are theme-specific. Can have other names or simply not exist in your current theme.
        remove_submenu_page( 'themes.php', 'yiw_panel' );
        remove_submenu_page( 'themes.php', 'custom-header' );
        remove_submenu_page( 'themes.php', 'custom-background' );
    }
}

add_action('admin_head', 'hide_menu');


hide_menu()函数的最后3行是针对我的主题的主题。您可以通过在管理面板中单击要隐藏的子菜单来找到第二个参数。这样,您的URL将类似于:example.com/wp-admin/themes.php?page=yiw_panel

因此,在此示例中,remove_submenu_page()函数的第二个参数将是yiw_panel

评论


这也为管理员隐藏了主题等。

– JorgeLuisBorges
17年9月15日在12:05

#3 楼

在WordPress 3.8中,这比当前接受的答案更好。

/**
 * @var $roleObject WP_Role
 */
$roleObject = get_role( 'editor' );
if (!$roleObject->has_cap( 'edit_theme_options' ) ) {
    $roleObject->add_cap( 'edit_theme_options' );
}


#4 楼

当我查看管理菜单结构时,似乎nav-menus.php链接与功能edit_theme_options相关联。您可以修改编辑者角色以包括此功能吗?这也将为他们提供编辑窗口小部件的选项,我不知道这是否有问题?所有菜单Ajax内容都受此功能限制,因此仅更改用于编辑菜单的管理菜单功能可能将不起作用。

#5 楼

内置插件“用户角色编辑器”-开启edit_theme_options-安装插件Adminimize-为编辑器关闭“小部件”和“切换主题”;)

#6 楼

到了2020年,WordPress现在已超过V5.3,所以我想我会提供一个更新的版本,其中该设置在主题激活后仅在数据库中保存一次-在主题激活时被删除。

 function add_theme_caps(){
  global $pagenow;
  // gets the author role
  $role = get_role('editor');

  if ('themes.php' == $pagenow && isset($_GET['activated'])) { 
          // Test if theme is activated
          // Theme is activated
          // This only works, because it accesses the class instance.
          // would allow the editor to edit the theme options
          $role->add_cap('edit_theme_options');
  } else {
         // Theme is deactivated
         // Remove the capability when theme is deactivated
         $role->remove_cap('edit_theme_options');
  }
}
add_action( 'load-themes.php', 'add_theme_caps' );

 


我也更喜欢以OOP风格进行编码,因此这是OOP版本:

 
/**
 * YourClient Class
 *
 * @author   John Doe
 * @package  YourClient
 * @since    1.0
 */
if (!defined('ABSPATH')) {
    exit;
}
if (!class_exists('YourClient')) {
    /**
     * The main YourClient class
     */
    class YourClient
    {
        /**
         * Setup class
         */

        public function __construct()
        {
            // Give more privileges on Theme Activation
            add_action('load-themes.php', array($this, 'add_theme_caps'));
        }

        function add_theme_caps()
        {
            global $pagenow;

            // gets the author role
            $role = get_role('editor');

            if ('themes.php' == $pagenow && isset($_GET['activated'])) { // Test if theme is activated
                // Theme is activated

                // This only works, because it accesses the class instance.
                // would allow the author to edit others' posts for current theme only
                $role->add_cap('edit_theme_options');
            } else {
                // Theme is deactivated
                // Remove the capability when theme is deactivated
                $role->remove_cap('edit_theme_options');
            }
        }
    }
}

 


#7 楼

我发现,您的菜单将以这种方式工作:安装插件“用户角色编辑器”,您可以在其中编辑编辑器角色的条件以及其他条件。打开edit_theme_options。但是,现在:您将在“主题”,“小部件”下看到“菜单”选项。因此,我将停用插件“用户角色编辑器”,并正确显示“菜单”的填充选项。请注意,停用插件“用户角色编辑器”仍然是激活编辑器的条件!对我有好处,也许对您也有帮助