web-dev-qa-db-ja.com

Wp_nav_menu()マークアップからのコンテナ要素の削除

'container' => falseの設定や theme_location の登録、フォーラムの検索など、いくつかのオプションを試してみましたが、wp_nav_menuに含まれる "div"を削除することはできません。

<?php get_nav_menu();?>

function get_nav_menu() {
    $navMenuDefaults = array(
    'theme_location'  => 'header-nav',
    'menu'            => '',
    'container'       => false,
    'container_class' => '',
    'container_id'    => '',
    'menu_class'      => '',
    'menu_id'         => '',
    'echo'            => true,
    'fallback_cb'     => 'wp_page_menu',
    'before'          => '',
    'after'           => '',
    'link_before'     => '',
    'link_after'      => '',
    'items_wrap'      => '<ul id="%1$s" class="%2$s">%3$s</ul>',
    'depth'           => 0,
    'walker'          => ''
);
    return wp_nav_menu($navMenuDefaults);
}

そしてfunctions.phpでは:

function register_top_nav() {
  register_nav_menu('header-nav',__( 'Header Nav' ));
}
add_action( 'init', 'register_top_nav' );

次のような出力が得られる理由はわかりません。

<div class="">
    <ul>
        <li class="page_item page-item-2">
            <a href="url">Sample Page</a>
        </li>
    </ul>
</div>

次のようにするにはどうすればよいですか。

<ul class="abc">
    <li>
        <a href="#">dfdf</a>
    </li>
</ul>

ありがとう。

4
me_digvijay

参考:container => ''は文字列操作で、デフォルトはdivで設定されています。true or false like bool expressionは使用できません。

container => 'ul'を変更するだけで、見たいものが手に入ります。詳細についてはこれを読んでください: https://developer.wordpress.org/reference/functions/wp_nav_menu/

ありがとうムーサ

3
MD MUSA

問題

WordPress管理ダッシュボードのAppearance > Menusパネルにメニューを作成していません

私の推論は、以下の条件下で起こるバグに基づいています。

  • ナビゲーションメニューは作成されていません
  • wp_nav_menu()がデフォルトの'fallback_cb'引数'wp_page_menu'で呼び出されました
  • コンテナを削除することを目的とした'container'引数でwp_nav_menu()が呼び出されました( empty()関数trueを返すもの)

ソリューション

次のいずれかで<div>コンテナを削除する必要があります。

  • Appearance > Menusパネルにメニューを作成します。新しいメニューを登録済みの<div>テーマの場所に関連付けなくても、余分な'header-nav'は消えます。
  • 'fallback_cb'引数を、デフォルトのマークアップ(または空の文字列)を返すカスタム関数に変更します。

    'fallback_cb' => function() { return ''; },
    

説明

wp_nav_menu()関数が指示されたメニューを見つけることができない場合、それはメニューマークアップを生成するためにさらに2つのことを試みます:

  1. 最初に見つかったメニューを表示します。
  2. 'fallback_cb'引数で指定された関数によって生成されたメニューマークアップを表示します(デフォルトでは、 wp_page_menu() )。

投稿されたマークアップは投稿IDが2でタイトルが "Sample Page"のpage投稿タイプで、おそらく新しいWordPressインストールを示しているので、メニューが作成されていないと考えるのは妥当でしょう。これは、フォールバック関数がインストール内の任意の数のページから即時メニューを作成するため、wp_nav_menu()呼び出しがwp_page_menu()にフォールバックする可能性が高いことを示しています。

'fallback_cb'関数が呼び出されると、wp_nav_menu()に与えられたのと同じ引数が渡されます(デフォルトの引数とマージされます)。 WordPress 4.4.0以降、この関数は実際に'container'引数を受け入れて処理するため、wp_page_menu()関数に関するCodexのドキュメントは少し古くなっています。そのため、wp_page_menu()に渡したのと同じ'container'引数、''(空の文字列リテラル)またはfalseを使ってwp_nav_menu()が呼び出されます。

問題の本質は、wp_page_menu()内の これらの行 に由来する矛盾する動作です。

// Fallback in case `wp_nav_menu()` was called without a container.
if ( empty( $container ) ) {
    $container = 'div';
}

そのため、empty()false''の両方をtrueに評価するので、このちょっとしたフェイルセーフはコンテナが欲しくないことに夢中になっていて、「for」に戻って追加します。

1
bosco

このシナリオで試すことができます。

ステップ1:

このコードをあなたのテーマのfunctions.phpファイルに入れてください。

add_action( 'after_setup_theme', 'theme_nav_setup' );

if ( ! function_exists( 'theme_nav_setup' ) ){
  function theme_nav_setup() {  
    register_nav_menu( 'header-nav_new', __( 'Main Menu', 'text-domain' ) );
  }
}

ステップ2:

それからあなたがこのメニュー出力を見ることができるところでこれを呼び出してください:

wp_nav_menu( array(
  'menu' => 'header-nav_new',
  'theme_location'    => 'header-nav_new',
  'depth'             => 6,
  'container'         => 'ul',
  'fallback_cb'       => 'wp_page_menu',
  'menu_class'        => 'abc'
 )
);
0
MD MUSA

私の経験上、登録済みのメニューの場所にmenuをまだ割り当てていない場合は、接頭辞containerを付けた引数設定はすべて機能しません。変更を確認する前に、作成したメニューを登録済みのメニューの場所に割り当てる必要があります。

0

はい、あなたはこのコードを使うことができます

$nav_menu = array(
       'title_li'        => '', 
       'container'       => '',
       'theme_location'  => 'header-nav',   
        'menu_class'     => '',
        'menu_id'        => '',
);                    

wp_nav_menu( $nav_menu );

上記のコードは、ulとliの両方のタグにクラスとIDを持たずに、メニューをulとliの形式で表示します。

0
Aftab

"container"をfalseに設定すると、環境上のどこかにバグがあるか、何か他のものと衝突しない限り、これはうまくいくはずです。

実際、私はこれを二十五と私のテーマフォレストテーマの一つでテストしました。

変更をすぐに反映していない内部キャッシュがあるかどうかを確認できますか?

ありがとう