web-dev-qa-db-fra.com

Deuxième navigation dans l'en-tête

En tant que noob, mon objectif est de fournir un menu secondaire pour ma page de blog (j'ai une page d'accueil statique) et je me demande quel est le meilleur moyen de placer la deuxième navigation dans les fichiers de modèle.

Grâce à mes compétences pour débutant PHP et après enquête sur les tutoriels, deux solutions semblent fonctionner pour moi:

A) Ajouter une balise conditionnelle dans le seul et unique header.php:

<nav id="site-navigation" class="main-navigation" role="navigation">
    <?php wp_nav_menu(array('theme_location' => 'menu-1', 'menu_id' => 'primary-menu')); ?>
</nav><!-- #site-navigation -->

<!-- my Secondary Menu solution one -->
<?php if (is_home()) { ?>
<nav>
    <?php wp_nav_menu(array('theme_location' => 'menu-2', 'menu_id' => 'menu-2')); ?>
</nav>
<?php } ?>

B) Créez un nouveau fichier appelé, par exemple. header-home.php qui est une copie du header.php principal et l'intégrer dans le modèle de blog.

header-home.php:

<nav id="site-navigation" class="main-navigation" role="navigation">
    <?php wp_nav_menu(array('theme_location' => 'menu-1', 'menu_id' => 'primary-menu')); ?>
</nav><!-- #site-navigation -->

<!-- my Secondary Menu Solution 2 -->
<nav>
<?php 
    wp_nav_menu(array('theme_location' => 'menu-2', 'menu_id' => 'menu-2'));
?>
</nav>

Ensuite, je devrais changer le fichier de modèle (dans mon cas, index.php) et le démarrer avec cette condition:

if( is_home() ) {
    get_header('home'); 

} else {
    get_header();
}

Voici mes questions:

  1. Existe-t-il de meilleures solutions pour atteindre mon objectif que les deux approches ci-dessus?

  2. Sinon, laquelle des deux solutions préféreriez-vous et pourquoi?

3
Friedrich Siever

Le mieux est toujours subjectif, cependant, je le formulerais de la manière suivante pour avoir un meilleur contrôle et un meilleur agencement de mes modèles:

Une structure pour avoir un contrôle granulaire:

Premièrement, je créerais un nouveau dossier, par exemple template-parts dans mon thème, puis à l'intérieur de celui-ci, un autre dossier, par exemple. navigation (avoir des parties de modèle séparées dans des dossiers différents).

Ensuite, dans le dossier <my-theme>/template-parts/navigation/, je créerai trois fichiers, par exemple.

  1. nav.php: il s’agira du fichier de modèle de navigation principal. Il contiendra des conditions et un balisage HTML habituel pour les deux menus.

  2. nav-one.php: il contiendra le balisage et le code spécifiques au menu de navigation principal (menu-un).

  3. nav-two.php: il contiendra le balisage et le code spécifique au menu de navigation secondaire (menu-deux).

Ces fichiers auront un contenu comme suit:

nav.php fichier:

<?php if ( has_nav_menu( 'one' ) ) : ?>
    <div class="navigation-one">
        <div class="wrap">
            <?php get_template_part( 'template-parts/navigation/nav', 'one' ); ?>
        </div><!-- .wrap -->
    </div><!-- .navigation-one -->
<?php endif; ?>

<?php if ( has_nav_menu( 'two' ) && is_home() ) : ?>
    <div class="navigation-two">
        <div class="wrap">
            <?php get_template_part( 'template-parts/navigation/nav', 'two' ); ?>
        </div><!-- .wrap -->
    </div><!-- .navigation-two -->
<?php endif; ?>

nav-one.php fichier:

<nav id="site-navigation" class="main-navigation" role="navigation">
    <?php wp_nav_menu(array('theme_location' => 'one', 'menu_id' => 'menu-one')); ?>
</nav><!-- #site-navigation -->

nav-two.php fichier:

<nav>
<?php 
    wp_nav_menu(array('theme_location' => 'two', 'menu_id' => 'menu-two'));
?>
</nav><!-- #secondary-navigation -->

Enfin, je mettrais simplement ceci dans mon fichier header.php:

get_template_part( 'template-parts/navigation/nav' );

Pourquoi?

  1. Vous aurez un simple appel de modèle d'une ligne à partir du fichier header.php et vous n'aurez pas besoin d'apporter deux modifications ultérieures dans deux fichiers header.php uniquement pour avoir différents menus.

  2. À partir de nav.php, vous pourrez contrôler les différentes conditions et les balises HTML générales du wrapper HTML pour les différents menus principaux. Pour un menu supérieur secondaire différent pour une autre page, vous n'avez plus besoin de modifier le fichier header.php.

  3. À partir de nav-one.php, nav-two.php (ajoutez-en autant que vous en avez besoin), vous contrôlerez le code et le balisage pour ce manuel uniquement. Vous n'avez pas à vous soucier des autres menus, de leurs annotations ou de leurs conditions. Si vous avez besoin d’un nouveau menu, ajoutez-le simplement, par exemple. nav-three.php puis ajoutez la condition nécessaire dans nav.php si vous souhaitez l’ajouter dans le menu supérieur.

  4. De cette façon, vous pourrez également utiliser le même fichier (menu) à un autre emplacement. Par exemple, vous voulez que le menu de navigation one soit également dans le pied de page. Ensuite, dans le pied de page, il vous suffira d’appeler: get_template_part( 'template-parts/navigation/nav', 'one' );

    C'est ça, vous n'aurez pas besoin d'écrire deux fois le même code.

Une fois que vous avez cette configuration, vous aurez un contrôle bien plus précis sur votre système de menus.

Remarque: le thème Twenty Seventeen par défaut de WordPress utilise une structure similaire.

2
Fayaz