This is how I\'ve interpreted from the wordpress docs at least. Originally these settings were made with add_setting
and it is where the capability was originally set. Fortunately, we can use get_setting
to change that value. It seems to work very well for your case.
function wpseo_206907_add_back_customizer_controls_for_not_admins( $wp_customize ) {
$wp_customize->get_setting( \'blogname\' )->capability = \'edit_theme_options\'; // or edit_posts or whatever capability your site owner has
}
add_action( \'customize_register\', \'wpseo_206907_add_back_customizer_controls_for_not_admins\', 1000 );
<小时>
If for some reason they don\'t have access to the customizer you need to give them the edit_theme_options capability first.
function wpseo_206951_add_capability_for_non_admin() {
$roleObject = get_role( \'editor\' ); // whoever should have access to theme changes
if (!$roleObject->has_cap( \'edit_theme_options\' ) ) {
$roleObject->add_cap( \'edit_theme_options\' );
}
}
add_action( \'admin_init\', \'wpseo_206951_add_capability_for_non_admin\');
This will give them access to the following:外观>小部件
外观>菜单
外观>自定义(如果当前主题支持它们)
外观>背景
外观>标题
If you\'d rather hide these pages all together do this:
function wpseo_206907_remove_by_caps_admin_menu() {
if ( !current_user_can(\'manage_options\') ) {
remove_menu_page(\'themes.php\'); // Appearance Menu on Admin
remove_submenu_page( \'themes.php\', \'widgets.php\' );
remove_submenu_page( \'themes.php\', \'nav-menus.php\' );
remove_submenu_page( \'themes.php\', \'theme-editor.php\' );
}
}
add_action(\'admin_menu\', \'wpseo_206907_remove_by_caps_admin_menu\', 999);
However, if you want them to have access to certain pages like widgets and menus, but not themes then do this instead:add_action( \'admin_init\', \'wpseo_206907_lock_theme\' );
function wpseo_206907_lock_theme() {
global $submenu, $userdata;
get_currentuserinfo();
if ( $userdata->ID != 1 ) {
unset( $submenu[\'themes.php\'][5] );
unset( $submenu[\'themes.php\'][15] );
}
}
You\'d also want to do this then to remove the theme change section section from the customizer:function wpseo_206951_remove_customizer_controls_all( $wp_customize ) {
if ( !current_user_can(\'manage_options\') ) {
$wp_customize->remove_section("themes"); // Removes Themes section from backend
// To remove other sections, panels, controls look in html source code in chrome dev tools or firefox or whatever and it will tell you the id and whether it\'s a section or panel or control.
//Example below (uncomment to use)
// $wp_customize->remove_section("title_tagline");
// $wp_customize->remove_panel("nav_menus");
// $wp_customize->remove_panel("widgets");
// $wp_customize->remove_section("static_front_page");
}
}
add_action( \'customize_register\', \'wpseo_206951_remove_customizer_controls_all\', 999 );