直接回答:
add_action( \'admin_menu\', function() {
global $current_user;
$current_user = wp_get_current_user();
$user_name = $current_user->user_login;
//check condition for the user means show menu for this user
if(is_admin() && $user_name != \'USERNAME\') {
//We need this because the submenu\'s link (key from the array too) will always be generated with the current SERVER_URI in mind.
$customizer_url = add_query_arg( \'return\', urlencode( remove_query_arg( wp_removable_query_args(), wp_unslash( $_SERVER[\'REQUEST_URI\'] ) ) ), \'customize.php\' );
remove_submenu_page( \'themes.php\', $customizer_url );
}
}, 999 );
您必须尊重完整的路径命名。
答案很长,这是:
add_action( \'admin_menu\', function() {
$page = remove_submenu_page( \'themes.php\', \'customize.php\' );
}, 999 );
不起作用。但这个:
add_action( \'admin_menu\', function() {
$page = remove_submenu_page( \'themes.php\', \'widgets.php\' );
}, 999 );
工作。如果我们只看链接,那么我们可以看到
should work, 但看看这个。在里面
wp-admin/menu.php, line 164
, 我们有:
$submenu[\'themes.php\'][6] = array( __( \'Customize\' ), \'customize\', esc_url( $customize_url ), \'\', \'hide-if-no-customize\' );
如果我们对此进行评论,砰
Customize
链接消失,但如果我们继续粘贴此代码并转到
wp-admin/index.php
, 我们可以看到没有
customize.php
在阵列中:
add_action( \'admin_menu\', function() {
global $submenu;
var_dump( $submenu );
}, 999 );
其他人在这里。发生了什么事?如果我们把
$submenu
创建完成后,我们可以看到它就在那里:
[themes.php] => Array
(
[5] => Array
(
[0] => Themes
[1] => switch_themes
[2] => themes.php
)
[6] => Array
(
[0] => Customize
[1] => customize
[2] => customize.php?return=%2Fwordpress%2Fwp-admin%2Findex.php
[3] =>
[4] => hide-if-no-customize
)
[10] => Array
(
[0] => Menus
[1] => edit_theme_options
[2] => nav-menus.php
)
)
。。。所以,在某个地方,它丢失了,
or so you would think, 在这个文件的末尾,我们再次看到,我们包含了另一个文件:
require_once(ABSPATH . \'wp-admin/includes/menu.php\');
如果我们在这个文件的末尾转储
$menu
, 我们得到的是。。令人惊讶的是,菜单中没有“customizer”。但就在刚才。
令人惊讶的是,如果我们这样做:
add_action( \'admin_menu\', function() {
global $submenu;
var_dump( $submenu );
}, 999 );
很明显
customize.php
是否有。。。除了它使用以下参数生成自身:
customize.php?return=%2Fwordpress%2Fwp-admin%2Findex.php
(这取决于您的站点)。
有趣,所以如果我们这样做:
add_action( \'admin_menu\', function() {
remove_submenu_page( \'themes.php\', \'customize.php?return=%2Fwordpress%2Fwp-admin%2Findex.php\' );
}, 999 )
或者,在您的情况下:
add_action( \'admin_menu\', function() {
remove_submenu_page( \'themes.php\', \'customize.php?return=%2Fwp-admin%2Findex.php\' );
}, 999 )
它起作用了。
那么我们今天学到了什么?WP Core是一个糟糕的废话,好吧,这是真的,但这是你的错误,你没有看到什么remove_submenu_page
查找。
function remove_submenu_page( $menu_slug, $submenu_slug ) {
global $submenu;
if ( !isset( $submenu[$menu_slug] ) )
return false;
foreach ( $submenu[$menu_slug] as $i => $item ) {
if ( $submenu_slug == $item[2] ) {
unset( $submenu[$menu_slug][$i] );
return $item;
}
}
return false;
}
在我们的例子中,它首先检查菜单是否存在
themes.php
然后它会检查每个项目,
Appearance
, 每个元素本身都是一个数组,然后它会查找第三个元素,该元素对应于
[2] => customize.php...
项目,所以,它当然不会找到我们的
customize.php
, 这就是为什么我们需要提供完整的链接。这只是一个简单的错误。