web-dev-qa-db-ja.com

ヘッダー内の2番目のナビゲーション

私の目標は私のブログページのための二次メニューを提供することです(私は静的なホームページを持っています)。

私の初心者PHPスキルとチュートリアルの調査の結果、私には2つの解決策がうまくいっているようです。

A) 唯一のメイン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) /と呼ばれる新しいファイルを作成します。 header-home.phpはメインのheader.phpのコピーで、ブログのテンプレートに統合されています。

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>

私の場合はテンプレートファイルを変更し(私の場合はindex.php)、この条件で開始する必要があります。

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

} else {
    get_header();
}

これが私の質問です。

  1. 上記の2つのアプローチよりも私の目標を達成するためのより良い解決策はありますか?

  2. そうでない場合は、2つの解決策のどちらを選択しますか、またその理由は何ですか。

2

最良は常に主観的なものですが、私は自分のテンプレートをよりよく制御し、より適切に配置するために、次のようにしました。

きめ細かい制御ができる構造

まず、新しいフォルダを作成します。私のテーマのtemplate-partsそしてその中の別のフォルダnavigation(異なるフォルダーに別々のテンプレート部分を入れるため)。

それから<my-theme>/template-parts/navigation/フォルダに3つのファイルを作成します。

  1. nav.php:これはメインのナビゲーションテンプレートファイルとして機能します。両方のメニューの条件と共通のHTMLラッパーマークアップが含まれます。

  2. nav-one.php:これは、プライマリナビゲーションメニュー(menu-one)に特有のマークアップとコードを含みます。

  3. nav-two.php:これには、セカンダリナビゲーションメニュー(menu-two)に固有のマークアップとコードが含まれます。

これらのファイルは次のような内容になります。

nav.phpファイル:

<?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ファイル:

<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ファイル:

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

最後に、これをheader.phpファイルに入れるだけです。

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

どうして?

  1. あなたはheader.phpファイルから簡単な一行のテンプレート呼び出しをするでしょう。あなたは異なるメニューを持つためだけに2つの異なるheader.phpファイルで将来の変更を二度する必要はないでしょう。

  2. nav.phpから、すべての異なるトップメニューに対して、すべての異なる条件および一般的なHTMLラッパーマークアップを制御できるようになります。別のページの別の2番目のトップメニューには、もうheader.phpファイルを変更する必要はありません。

  3. nav-one.phpnav-two.php(必要なだけ追加する)から、あなたはそのManuだけのためにCODEとマークアップをコントロールするでしょう。他のメニューやそれらのマークアップや状態について心配する必要はありません。あなたが新しいメニューが必要な場合は、単にそれを追加してください。トップメニューに追加したい場合はnav-three.phpファイルをクリックしてからnav.phpに必要条件を追加してください。

  4. これにより、同じファイル(メニュー)を別の場所でも使用できるようになります。たとえば、ナビゲーションメニューoneもフッターにする必要があります。フッターでは、呼び出す必要があります:get_template_part( 'template-parts/navigation/nav', 'one' );

    それだけです、同じコードを2回書く必要はないでしょう。

この設定が完了したら、メニューシステムをはるかにきめ細かく制御できます。

注意:WordPressのデフォルトのTwenty Seventeenテーマも同様の構造を使用しています。

1
Fayaz