web-dev-qa-db-fra.com

Supprimer nav_menus de l'outil de personnalisation à l'aide d'un thème

Existe-t-il un moyen de supprimer le "Menu" ou le devcode nav_menus du personnaliseur?

J'ai essayé $wp_customize->remove_section('nav_menus'); mais cela n'a pas fonctionné.

$wp_customize->remove_section('nav_menu'); (s supprimé) ne fonctionnait pas non plus.

$wp_customize->remove_section('menus'); n'a pas non plus fonctionné.

$wp_customize->remove_section('wp_nav_menus'); n'a pas fonctionné non plus.

S'il vous plaît aidez-moi ici!

3
J. Doe

Ceci est un panneau et non une section, donc remove_section() ne fonctionnera pas dans ce cas. Cependant, vous pouvez utiliser la fonction remove_panel() mais cela déclenchera un avis disant

Avis: WP_Customize_Manager :: remove_panel a été appelé incorrectly Supprimer manuellement nav_menus causera PHP avertissements. Utilisez plutôt le filtre customize_loaded_components . S'il vous plaît voir le débogage dans WordPress pour plus d'informations. (Ce message a été ajouté à la version 4.5.) Dans\wp-includes\functions.php à la ligne 3897

Maintenant customize_loaded_components filter dit

Cela permet d’exclure les composants principaux de l’instant en les filtrant hors de la matrice. Notez que ce filtre s’exécute généralement pendant l’action ‘plugins_loaded’ et qu’il ne peut donc pas être ajouté à un thème.

Il n’existe donc aucun moyen simple de supprimer une section de menu du personnalisateur et d’utiliser un thème, mais si vous le souhaitez, j’ai trouvé une solution (peut-être pas si bonne) qui fonctionne sans aucun avertissement ni erreur.

Dans la classe WP_Customize_Nav_Menus, vérification du constructeur pour

if ( ! current_user_can( 'edit_theme_options' ) ) {
    return;
}

Et puis enregistrez toutes les actions/filtres pour la section de menu de la nef, supprimant ainsi tous les filtres/actions pouvant faire l'affaire. Mais pour supprimer ces filtres/actions, nous avons besoin du même objet que celui utilisé pour les enregistrer. Et oui, nous l’avons dans le rappel d’action customize_register.

Vous pouvez ajouter ce code à votre thème functions.php

add_action('customize_register', function ( $WP_Customize_Manager ){
    //check if WP_Customize_Nav_Menus object exist
    if (isset($WP_Customize_Manager->nav_menus) && is_object($WP_Customize_Manager->nav_menus)) {

        //Remove all the filters/actions resiterd in WP_Customize_Nav_Menus __construct
        remove_filter( 'customize_refresh_nonces', array( $WP_Customize_Manager->nav_menus, 'filter_nonces' ) );
        remove_action( 'wp_ajax_load-available-menu-items-customizer', array( $WP_Customize_Manager->nav_menus, 'ajax_load_available_items' ) );
        remove_action( 'wp_ajax_search-available-menu-items-customizer', array( $WP_Customize_Manager->nav_menus, 'ajax_search_available_items' ) );
        remove_action( 'customize_controls_enqueue_scripts', array( $WP_Customize_Manager->nav_menus, 'enqueue_scripts' ) );
        remove_action( 'customize_register', array( $WP_Customize_Manager->nav_menus, 'customize_register' ), 11 );
        remove_filter( 'customize_dynamic_setting_args', array( $WP_Customize_Manager->nav_menus, 'filter_dynamic_setting_args' ), 10, 2 );
        remove_filter( 'customize_dynamic_setting_class', array( $WP_Customize_Manager->nav_menus, 'filter_dynamic_setting_class' ), 10, 3 );
        remove_action( 'customize_controls_print_footer_scripts', array( $WP_Customize_Manager->nav_menus, 'print_templates' ) );
        remove_action( 'customize_controls_print_footer_scripts', array( $WP_Customize_Manager->nav_menus, 'available_items_template' ) );
        remove_action( 'customize_preview_init', array( $WP_Customize_Manager->nav_menus, 'customize_preview_init' ) );
        remove_filter( 'customize_dynamic_partial_args', array( $WP_Customize_Manager->nav_menus, 'customize_dynamic_partial_args' ), 10, 2 );

    }
}, -1); //Give it a lowest priority so we can remove it on right time
2
Sumit