私は、サイト管理者が「管理オプション」機能を持たないマルチサイトを構築しています。問題は、この上限がないとカスタマイザーの「サイト識別」タブが見えず、そこでサイトアイコン(favicon)とサイト名を変更できることです。
このタブを表示してその内容を保存するために必要な機能を変更する方法はありますか?そうでない場合は、このタブと同じフィールドをカスタマイザのカスタムタブに表示する方法はありますか。
ありがとう。良い一日を。
これが私がwordpress のドキュメント から少なくとも解釈した方法です。もともとこれらの設定はadd_setting
で作られていて、それは機能が最初に設定されたところです。幸い、その値を変更するためにget_setting
を使用することができます。あなたの場合はとてもうまくいくようです
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 );
何らかの理由でカスタマイザにアクセスできない場合は、最初にedit_theme_options機能を付与する必要があります。
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');
これにより、次のものにアクセスできるようになります。
外観>ウィジェット
外観>メニュー
外観>現在のテーマでサポートされている場合はカスタマイズします
外観>背景
外観>ヘッダー
これらのページをまとめて非表示にする場合は、次の手順を実行します。
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);
ただし、ウィジェットやメニューなどの特定のページにアクセスできるようにしたいが、テーマにはアクセスしたくない場合は、代わりに次のようにします。
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] );
}
}
その後、カスタマイザからテーマ変更セクションセクションを削除するためにもこれを実行したいと思います。
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 );