Eliminar la página del submenú “customize.php” en WordPress 4.0

3 minutos de lectura

Cuando estaba ejecutando WP 3.9.2, pude usar el siguiente código para eliminar el elemento del menú Personalizar de Apariencia en el menú de administración.

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

Una vez que actualicé a 4.0, esto ya no funciona.

avatar de usuario
ov3rfly

Esto funciona con WordPress 4.1 y 4.0 y 3.x aquí:

Editar: Ajustado para compatibilidad con 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 );

  • Parece que la respuesta de @chrisphilton es mucho más sucinta.

    – Phil Healey

    16 de enero de 2017 a las 13:10

  • ¡Mayormente funciona! Pero no elimina el fondo personalizado en 4.9. Lo intentaré en 4.8 más tarde.

    – Chris rosa

    16 de noviembre de 2017 a las 11:43


  • Esta es la única solución en esta página que funcionó para mí. Debería ser la respuesta aceptada.

    – Tyler Kemme

    14 de junio de 2018 a las 18:58

La respuesta debe ser:

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

La forma en que rjb usó una matriz como aguja en in_array() en la respuesta aceptada no funciona. Mira por qué en los documentos. Reemplacé in_array con otro foreach que recorre las matrices de $menu_item y busca ‘personalizar’ como parte del valor.

Me funciona con WordPress 4.9.6

  • +1000. Esta debería ser la respuesta aceptada, corrigiendo un error de PHP obvio que nadie más detectó durante seis meses…

    – Theo d’Or

    25/06/2018 a las 18:00

  • ✓ Funciona en 5.0.3

    – Kontur

    14 de enero de 2019 a las 14:27

  • ✓ Funciona en 5.1.1

    – jake

    22 de marzo de 2019 a las 2:25

Puede modificar directamente la $submenus global así:

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

Estoy usando esto en la misma función, conectado a admin_menuya que uso para desarmar otros elementos de administración y parece estar funcionando bien

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');

  • ¿Hay alguna preocupación acerca de que el índice del menú Apariencia en esa matriz cambie en versiones futuras?

    – Isabela

    17 de septiembre de 2014 a las 12:12


  • @isabisa Inicialmente pensé que tenías frío solo usa array_search pero dado que es una matriz multidimensional, podría usar un enfoque como el descrito en este hilo.

    – Andrew Cafourek

    17/09/2014 a las 17:46


avatar de usuario
rjb

Editar: Actualizado para WordPress 4.9+ y mayor compatibilidad con PHP

El núcleo de WordPress no ofrece un gancho de forma nativa deshabilitar el personalizador de temaspero hay es una forma inteligente y elegante para eliminar el enlace “Personalizar” del menú Apariencia alterando el global $submenu variable:

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

Mientras que otras muestras de código aquí y en otros lugares se basan irresponsablemente en índices numéricos específicos de la $submenú variable (por ejemplo $submenu['themes.php'][6][0]…), este método atraviesa de forma inteligente la jerarquía, por lo que debería ser compatible con versiones anteriores (3.x) y nuevas de WordPress (4.x) por igual.

De hecho, puedes usar remove_submenu_page para eliminar la opción del submenú del tema de la pantalla de administración. El truco es que la URL debe coincidir exactamente con lo que se vincula en el administrador para que funcione esa función.

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' );

He determinado mediante programación la URL del administrador en el caso de que no esté simplemente usando ‘/wp-admin’. @isabisa Esto también evitará interrupciones en el futuro si el índice del elemento del menú cambia alguna vez.

¡Estoy usando esto en WP 4.0 y funciona muy bien!

  • ¡Una buena respuesta sucinta, que no necesita llamar global! Esto es especialmente útil cuando tiene una función que se utiliza para eliminar otros elementos de menú/submenú.

    – Phil Healey

    16 de enero de 2017 a las 13:12

Eliminar el menú es solo una solución a medias, ya que no deshabilita por completo el personalizador. Para deshabilitar de forma completa y segura el personalizador (y también eliminar el menú), debe eliminar el permiso del personalizador de todos los usuarios. Algo como esto lo haría:

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

  • ¡Una buena respuesta sucinta, que no necesita llamar global! Esto es especialmente útil cuando tiene una función que se utiliza para eliminar otros elementos de menú/submenú.

    – Phil Healey

    16 de enero de 2017 a las 13:12

avatar de usuario
Kuba Paczyński

WordPress >= 4.9.8

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

¿Ha sido útil esta solución?