【问题标题】:Remove submenu page "customize.php" in WordPress 4.0删除 WordPress 4.0 中的子菜单页面“customize.php”
【发布时间】:2014-09-11 13:17:11
【问题描述】:

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

function remove_customize() {
  remove_submenu_page('themes.php', 'customize.php');
}
add_action('admin_init', 'remove_customize', 999);

一旦我更新到 4.0,它就不再工作了。

【问题讨论】:

    标签: wordpress


    【解决方案1】:

    这里适用于 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 );
    

    【讨论】:

    • 看来@chrisphilton 的回答要简洁很多。
    • 最有效!但不会删除 4.9 中的自定义背景。我会在 4.8 之后尝试。
    • 这是此页面上唯一对我有用的解决方案。应该是公认的答案。
    【解决方案2】:

    答案应该是:

    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 ] );
                }
            }
        }
    }
    });
    

    在接受的答案中,rjb 使用数组作为 in_array() 中的指针的方式不起作用。看看为什么in the docs。我用另一个 foreach 替换了 in_array,它遍历 $menu_item 数组并查找“customize”作为值的一部分。

    适用于我的 WordPress 4.9.6

    【讨论】:

    • +1000。这应该是公认的答案,纠正了一个明显的 PHP 错误,六个月来没有其他人发现......
    • ✓ 适用于 5.0.3
    • ✓ 适用于 5.1.1
    【解决方案3】:

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

    global $submenu;
    unset($submenu['themes.php'][6]); // Customize link
    

    我在同一个函数中使用它,连接到 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');
    

    【讨论】:

    • 是否担心该数组中外观菜单的索引在未来版本中会发生变化?
    • @isabisa 最初我以为你冷了就用array_search,但由于它是一个多维数组,你可以使用this thread中描述的方法。
    【解决方案4】:

    您实际上可以使用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' );
    

    如果您不只是使用“/wp-admin”,我已经以编程方式确定了管理员 URL。 @isabisa 如果菜单项的索引发生变化,这也将避免将来中断。

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

    【讨论】:

    • 一个简洁的答案,不需要调用全局!当您有一个用于删除其他菜单/子菜单项的功能时,这尤其有用。
    【解决方案5】:

    编辑:针对 WordPress 4.9+ 进行了更新并增加了与 PHP

    WordPress 核心并没有提供与原生 disable the theme customizer 的挂钩,但有一种巧妙而优雅的方式,可以通过更改全局 $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 ] );
                }
            }
        }
    });
    

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

    【讨论】:

    • 我正在使用 WP 8.4。 'Customize' 的检查在这里确实有效,我不得不将其更改为 'Customizer'。
    • 在 WP 4.8 中对我不起作用(如果 'Customize' 更改为 'Customizer' 也不起作用。@Ov3rfly 下面的回答有效。
    • @nachtigall 我更新了答案以反映 WordPress 4.8+ 和 PHP 5.x+ 的当前使用情况。
    • in_array 与“针”数组一起使用对我不起作用。当我将“needle”更改为字符串时,它起作用了,即in_array( 'customize', $menu_item )
    • 由于某种原因,“针”的阵列不适合我。您可以通过调整 if 语句来保持相同的功能,如 if ( in_array( 'Customize', $menu_item, true ) || in_array( 'Customizer', $menu_item, true ) || in_array( 'customize', $menu_item, true )) { }
    【解决方案6】:

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

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

    【讨论】:

    • 此解决方案使用 v5.1.8 从管理栏和管理面板外观菜单中完全删除了定制器链接。谢谢!
    【解决方案7】:

    WordPress >= 4.9.8

    add_action('admin_menu', function () {
      $request = urlencode($_SERVER['REQUEST_URI']);
      remove_submenu_page('themes.php', 'customize.php?return='. $request);
    }, 999);
    

    【讨论】:

      【解决方案8】:

      @rjb 接受的答案不适用于我的西班牙语 wordpress,但只需将 Customize 更改为 customize 就可以了。

      /**
       * 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( 'customize', $menu_item ) ) {
                      unset( $submenu[ 'themes.php' ][ $index ] );
                  }
              }
          }
      });
      

      【讨论】:

        【解决方案9】:

        适用于 wordpres 5.*

        从 Wordpress 管理员中删除自定义,您还需要从侧边栏和前端的顶部栏中删除

        从侧边栏菜单

        add_action( 'admin_menu', 'remove_customize' );
        
        function remove_customize() {
            global $submenu;
            if ( isset( $submenu[ 'themes.php' ] ) ) {
                foreach ( $submenu[ 'themes.php' ] as $index => $menu_item ) {
                    if(in_array('Customize', $menu_item) || in_array('Customizer', $menu_item) || in_array('customize', $menu_item))
                    {
                        unset( $submenu[ 'themes.php' ][ $index ] );
                    }
                }
            }
        }
        

        来自顶部的管理栏(在前端)

        add_action( 'admin_bar_menu', 'remove_customize_menu_bar', 999 );
        
        function remove_customize_menu_bar( $wp_admin_bar ) {
            $wp_admin_bar->remove_node( 'customize' );
        }
        

        这将完全禁用自定义选项:)

        【讨论】:

        • 这对我来说非常有效。小旁注:它并没有完全删除定制器,因为仍然有从主题指向它的按钮。
        【解决方案10】:

        对于 WordPress 5

        add_action( 'admin_menu', function() {
            remove_submenu_page( 'themes.php', 'customize.php?return=' . urlencode($_SERVER['SCRIPT_NAME']));
        }, 999 )
        

        【讨论】:

          【解决方案11】:

          尝试在“admin_menu”中更改“admin_init”

          【讨论】:

            【解决方案12】:

            @bash88 answer@Emanuel A. answer 有效,但如果您还想从主题页面中删除按钮(蓝色自定义按钮),答案应该是:

            经过测试的 WordPress 5.0.3

            /**
             * Remove customize links from admin panel.
             */
            function admin_remove_customize_links() {
                echo '<style>.hide-if-no-customize { display: none !important; }</style>';
            }
            add_action( 'admin_head', 'admin_remove_customize_links' );
            

            【讨论】:

              【解决方案13】:

              更新批准的响应 (Wordpress 5)

              add_action( 'admin_menu', 'rompiot_remove_customize' );
              
              /**
               * Remove Admin Menu Link to Theme Customizer
               */
              public function rompiot_remove_customize()
              {
                  global $submenu;
              
                  if (isset($submenu['themes.php'])) {
                      
                      foreach ($submenu['themes.php'] as $index => $array_menu_item) {
              
                          foreach ($array_menu_item as $key => $menu_item) {
                              if (in_array($menu_item, ['Customize', 'Customizer', 'customize'])) {
                                  unset($submenu['themes.php'][$index]);
                              }
                          }                
              
                      }
                  }
              }
              

              【讨论】:

                【解决方案14】:

                WORDPRESS 5.7+ 的功能代码,2021 年 8 月

                我需要为我们正在处理的大型 WP 网站自定义 WP 管理栏(调整大小时文本从管理栏跑出)。我从这个问题的所有先前答案中尝试了每一个 sn-p 代码;不幸的是,没有一个对我有用。我在 Google 上找到了这段代码,所以我想与其他人分享(在你的 functions.php 中):

                /**
                 * This function removes items from the WP admin bar. If it gets too cluttered,
                 * things will run off the screen and look bad.
                 * @param object $wp_admin_bar representing the WP admin bar.
                 */
                function remove_from_admin_bar($wp_admin_bar) {
                    // WordPress Core Items (uncomment to remove)
                    $wp_admin_bar->remove_node('updates');
                    $wp_admin_bar->remove_node('comments');
                    //wp_admin_bar->remove_node('new-content');
                    $wp_admin_bar->remove_node('wp-logo');
                    //$wp_admin_bar->remove_node('site-name');
                    //$wp_admin_bar->remove_node('my-account');
                    //$wp_admin_bar->remove_node('search');
                    $wp_admin_bar->remove_node('customize');
                }
                
                add_action('admin_bar_menu', 'remove_from_admin_bar', 999);
                

                我认为一个好的开始是删除 cmets、更新和 WP 图标。自定义插件也可以在这里禁用。 999 表示挂钩将在稍后触发。如果您想在前端与 WP 管理员之间隐藏或显示不同的链接,您可以将元素包装在 is_admin() 函数中。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2012-11-30
                  • 2013-11-30
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-08-04
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多