web-dev-qa-db-ja.com

メニューが作成されるまで、 'wp_nav_menu'関数が機能するのはなぜですか?

私はwordpress用のテーマを作成しようとしているので、クリーンインストールをしました。エントリー、ページ、メニューを作成していません。

この時点で私はメニューを作成する部分にいるので、私はfunctions.phpファイルに次の関数を作成しました。

<?php register_nav_menus( array(
  'menu' => 'Menu superior',)); ?>

そしてそれを私のheader.phpに実装するために、私はこのように実装しました:

<!-- Menu -->
<nav id="menu">  
    <h2>Menu</h2>      
    <?php wp_nav_menu(array(
    'container' => false, 
    'items_wrap' => '<ul> %3$s</ul>', 
    'theme_location' => 'menu', 
    )); ?>
</nav>

実行しても、追加した要素にスタイルが設定されていないことに気付きました。これらの要素は、作成されたページです。この場合は、インストールで生成されたページです。このようになります: Sin menu creado manualmente

それから私はメニューセクションに行き、要素を追加することによって手動でそれを作成しました。私は要求通りにメニューが表示されることに気づいた。

enter image description here

ここでの問題は、私がWordpressのクリーンインストールをしていてもメニューを作成しないユーザーに私のテーマを提供すると、メニューにdivコンテナが追加されるので私のメニューはデザインなしで表示されます。それまで作成されたページは追加されますが、スタイルは追加されません。それを取得した人に、スタイルを適用するためのメニューを最初に作成する必要があることを指定する必要がありますか。それとも、最初からスタイルで正しく見えるように何らかの形を作ることができますか?

私はあなたの助けに感謝します! (謝罪、私は翻訳者を使わなければなりませんでした)

ソリューション

私はそれを次のように解決しました:

    <!-- Menu -->
    <nav id="menu">  
        <h2>Menu</h2>      
        <?php 
        if ( has_nav_menu( 'menu' ) ) {
            wp_nav_menu(array(
                'container' => false, 
                'items_wrap' => '<ul> %3$s</ul>', 
                'theme_location' => 'menu', 
                ));
        }else{
            echo "<ul>";
            wp_list_pages('title_li=');
            echo "</ul>";
        }
        ?>
    </nav>

Miloが述べたように、私はそのメニューがまだ存在していないかどうかをチェックして特定のアクションを実行しなければなりませんでした。

1
Gibrán

これは wp_nav_menu パラメータfallback_cbが原因です。

メニューが存在しない場合は、コールバック関数が起動します。デフォルトは 'wp_page_menu'です。フォールバックしない場合はfalseに設定します。

代替を指定していないため、デフォルトの wp_page_menu が使用されます。

適切なマークアップを使ってページメニューを表示する独自の関数を作成することも、fallback_cbパラメータをfalseに設定して何も表示しないこともできます。

has_nav_menu は、メニューが利用できないときに代替マークアップを表示するのにも役立つかもしれません。

1
Milo