web-dev-qa-db-fra.com

Comment créer un menu automatiquement?

J'essaie d'ajouter le support du menu de navigation de BuddyPress à mon thème et, malheureusement, les balises de modèle de BP ne sont toujours pas à la hauteur. (En gros, si vous ne créez pas un thème enfant explicite pour le thème BP Default, vous devez réinventer plusieurs roues.)

Donc ce que j'aimerais faire c'est

  1. Détecter quand BP est actif (je sais comment faire cela)
  2. Enregistrer une position de menu quand BP est actif (également une quantité connue)
  3. Créer un menu par défaut contenant des liens vers les sections BP ( c’est là que se trouve le trou dans ma connaissance )
  4. Attribuer ledit menu par défaut à la position nouvellement enregistrée

Donc, essentiellement, avec mon thème actif, si un utilisateur active BuddyPress, il obtiendra automatiquement un menu avec Membres, Forums, Activité, etc. et sera affiché à une position, mais si les utilisateurs souhaitent remplacer le menu, ils seraient libres de le faire. Pensées?

EDIT 1

Bainternet remporte le prix. Voici ce que j'ai fait, légèrement modifié par rapport à sa solution:

J'ai enregistré sous condition un emplacement de menu

if( function_exists( 'bp_get_loggedin_user_nav' ) ){
    register_nav_menu( 'lblgbpmenu', 'Default BuddyPress Menu' );
}

J'ai ensuite pris un appel conditionnel à la configuration du menu

if( function_exists( 'bp_get_loggedin_user_nav' ) ){
    add_action( 'widgets_init', 'lblg_add_default_buddypress_menu' );
}

Enfin, j'ai enregistré le menu.

function lblg_add_default_buddypress_menu(){
    global $lblg_themename;
    $menuname = $lblg_themename . ' BuddyPress Menu';
    $bpmenulocation = 'lblgbpmenu';
    // Does the menu exist already?
    $menu_exists = wp_get_nav_menu_object( $menuname );

    // If it doesn't exist, let's create it.
    if( !$menu_exists){
        $menu_id = wp_create_nav_menu($menuname);

        // Set up default BuddyPress links and add them to the menu.
        wp_update_nav_menu_item($menu_id, 0, array(
            'menu-item-title' =>  __('Home'),
            'menu-item-classes' => 'home',
            'menu-item-url' => home_url( '/' ), 
            'menu-item-status' => 'publish'));

        wp_update_nav_menu_item($menu_id, 0, array(
            'menu-item-title' =>  __('Activity'),
            'menu-item-classes' => 'activity',
            'menu-item-url' => home_url( '/activity/' ), 
            'menu-item-status' => 'publish'));

        wp_update_nav_menu_item($menu_id, 0, array(
            'menu-item-title' =>  __('Members'),
            'menu-item-classes' => 'members',
            'menu-item-url' => home_url( '/members/' ), 
            'menu-item-status' => 'publish'));

        wp_update_nav_menu_item($menu_id, 0, array(
            'menu-item-title' =>  __('Groups'),
            'menu-item-classes' => 'groups',
            'menu-item-url' => home_url( '/groups/' ), 
            'menu-item-status' => 'publish'));

        wp_update_nav_menu_item($menu_id, 0, array(
            'menu-item-title' =>  __('Forums'),
            'menu-item-classes' => 'forums',
            'menu-item-url' => home_url( '/forums/' ), 
            'menu-item-status' => 'publish'));

        // Grab the theme locations and assign our newly-created menu
        // to the BuddyPress menu location.
        if( !has_nav_menu( $bpmenulocation ) ){
            $locations = get_theme_mod('nav_menu_locations');
            $locations[$bpmenulocation] = $menu_id;
            set_theme_mod( 'nav_menu_locations', $locations );
        }

    } 
}
6
ZaMoose

Donc, fondamentalement, vous demandez comment créer un menu personnalisé par code et l’affecter à un emplacement de menu:

 //give your menu a name
$name = 'theme default menu';
 //create the menu
$menu_id = wp_create_nav_menu($name);
 //then get the menu object by its name
$menu = get_term_by( 'name', $name, 'nav_menu' );
 //then add the actuall link/ menu item and you do this for each item you want to add
wp_update_nav_menu_item($menu->term_id, 0, array(
    'menu-item-title' =>  __('Home'),
    'menu-item-classes' => 'home',
    'menu-item-url' => home_url( '/' ), 
    'menu-item-status' => 'publish'));
// you add as many items ass you need with wp_update_nav_menu_item()

//then you set the wanted theme  location
$locations = get_theme_mod('nav_menu_locations');
$locations['LOCATION_NAME'] = $menu->term_id;
set_theme_mod( 'nav_menu_locations', $locations );

Il vous suffit donc d'ajouter autant de liens que vous le souhaitez, de remplacer LOCATION_NAME par le nom de l'emplacement actuel et de vous assurer que ce code n'est exécuté qu'une seule fois.

6
Bainternet

Votre appel à wp_nav_menu() doit inclure une fonction de rappel personnalisée, telle qu'un appel à wp_list_pages(), à laquelle vous pouvez passer un argument include, dans lequel vous pouvez inclure des ID de page explicites.

0
Chip Bennett