删除WordPress 4.0中的子菜单页"customize.php"

isa*_*isa 8 wordpress

当我运行WP 3.9.2时,我能够使用以下代码从管理菜单中的外观中删除自定义菜单项.

function remove_customize() {
  remove_submenu_page('themes.php', 'customize.php');
}
add_action('admin_init', 'remove_customize', 999);
Run Code Online (Sandbox Code Playgroud)

一旦我更新到4.0,这将不再有效.

Ov3*_*fly 17

这适用于WordPress 4.1和4.0以及3.x:

编辑:调整WordPress 4.1兼容性:

function remove_customize() {
    $customize_url_arr = array();
    $customize_url_arr[] = 'customize.php'; // 3.x
    $customize_url = add_query_arg( 'return', urlencode( wp_unslash( $_SERVER['REQUEST_URI'] ) ), 'customize.php' );
    $customize_url_arr[] = $customize_url; // 4.0 & 4.1
    if ( current_theme_supports( 'custom-header' ) && current_user_can( 'customize') ) {
        $customize_url_arr[] = add_query_arg( 'autofocus[control]', 'header_image', $customize_url ); // 4.1
        $customize_url_arr[] = 'custom-header'; // 4.0
    }
    if ( current_theme_supports( 'custom-background' ) && current_user_can( 'customize') ) {
        $customize_url_arr[] = add_query_arg( 'autofocus[control]', 'background_image', $customize_url ); // 4.1
        $customize_url_arr[] = 'custom-background'; // 4.0
    }
    foreach ( $customize_url_arr as $customize_url ) {
        remove_submenu_page( 'themes.php', $customize_url );
    }
}
add_action( 'admin_menu', 'remove_customize', 999 );
Run Code Online (Sandbox Code Playgroud)


小智 10

答案应该是:

add_action( 'admin_menu', function () {
global $submenu;
if ( isset( $submenu[ 'themes.php' ] ) ) {
    foreach ( $submenu[ 'themes.php' ] as $index => $menu_item ) {
        foreach ($menu_item as $value) {
            if (strpos($value,'customize') !== false) {
                unset( $submenu[ 'themes.php' ][ $index ] );
            }
        }
    }
}
});
Run Code Online (Sandbox Code Playgroud)

rjb在接受的答案中使用数组作为in_array()中的指针的方式不起作用.查看文档中的原因.我将in_array替换为循环遍历$ menu_item数组的另一个foreach,并查找'customize'作为值的一部分.

使用WordPress 4.9.6为我工作

  • +1000。这应该是公认的答案,纠正了一个明显的 PHP 错误,六个月来没有人发现... (2认同)

小智 8

你可以$submenus像这样直接修改全局:

global $submenu;
unset($submenu['themes.php'][6]); // Customize link
Run Code Online (Sandbox Code Playgroud)

我在同一个函数中使用它,挂钩admin_menu,因为我用来取消设置其他管理项目,它似乎工作正常

function as_remove_menus () {
       remove_menu_page('upload.php'); //hide Media
       remove_menu_page('link-manager.php'); //hide links
       remove_submenu_page( 'edit.php', 'edit-tags.php' ); //hide tags
       global $submenu;
        // Appearance Menu
        unset($submenu['themes.php'][6]); // Customize
}
add_action('admin_menu', 'as_remove_menus');
Run Code Online (Sandbox Code Playgroud)


chr*_*ton 6

实际上,您可以使用remove_submenu_page从管理屏幕中删除主题子菜单选项.诀窍在于,url必须与管理中与该功能完全链接的内容相匹配才能工作.

function remove_admin_menus() {

    remove_submenu_page( 
        'themes.php', 
        'customize.php?return=' . 
            urlencode( str_replace( get_bloginfo('url'), "", get_admin_url() ) ) . 
            'themes.php' );

}

add_action( 'admin_init', 'remove_admin_menus' );
Run Code Online (Sandbox Code Playgroud)

在您不是简单地使用'/ wp-admin'的情况下,我已经以编程方式确定了管理URL.@isabisa如果菜单项的索引发生变化,这也将避免将来破坏.

我在WP 4.0中使用它,效果很好!


rjb*_*rjb 5

编辑:针对 WordPress 4.9+ 更新并增加了与 PHP <= 5.4 的兼容性

WordPress 核心不提供本地禁用主题定制器的钩子,但是有一种巧妙而优雅的方法可以通过更改全局$submenu变量从外观菜单中删除“自定义”链接:

/**
 * Remove Admin Menu Link to Theme Customizer
 */
add_action( 'admin_menu', function () {
    global $submenu;

    if ( isset( $submenu[ 'themes.php' ] ) ) {
        foreach ( $submenu[ 'themes.php' ] as $index => $menu_item ) {
            if ( in_array( array( 'Customize', 'Customizer', 'customize' ), $menu_item ) ) {
                unset( $submenu[ 'themes.php' ][ $index ] );
            }
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

虽然此处和其他地方的其他代码示例不负责任地依赖全局$submenu变量的特定数字索引(例如$submenu['themes.php'][6][0],...),但此方法智能地遍历层次结构,因此它应该与旧 (3.x) 和更新版本的WordPress (4.x) 类似。

  • 由于某种原因,“针”的数组对我不起作用。您可以通过调整 if 语句来保持相同的功能,如下所示 `if ( in_array( 'Customize', $menu_item, true ) || in_array( 'Customizer', $menu_item, true ) || in_array( 'customize', $menu_item ,真 )) { }`。 (3认同)

And*_*vic 5

删除菜单只是一个半途而废的解决方案,因为它并没有完全禁用定制器。为了完全、安全地禁用定制器(并删除菜单),您需要删除所有用户的定制器权限。像这样的事情会做到这一点:

add_filter('map_meta_cap', function($caps, $cap, $user_id, $args) {
    if ('customize' == $cap) return ['do_not_allow'];
    return $caps;
}, 10, 4);
Run Code Online (Sandbox Code Playgroud)