web-dev-qa-db-ja.com

プログラムで新しいメニュー項目を挿入する方法

私はプラグインを開発していて、メニュー項目をプログラムで挿入したいのです。

私のテーマがメニューを作成するとき、それはこの呼び出しを使います:

wp_nav_menu( array( 'theme_location' => 'primary', 'menu_class' => 'nav-menu' ) );

その結果、HTMLでは次のようになりました。

<div class="nav-menu"><ul>
     <li class="current_page_item"><a href="somewhere">menu-item-1</a></li>
     <li class="page_item page-item-107"><a href="somewhere-else">menu item 2</a></li>
</ul></div>

</ul>を閉じる前に、これをなんらかの形で傍受してプログラムで自分のHTMLを挿入できるようにしたいと思います。どうやって接続するのですか?

6
agro1986

印刷される前に、すべてのメニュー項目がフィルタを通過します。 wp_nav_menu_itemsフィルタをターゲットにして、メニューに追加することができます。

// Filter wp_nav_menu() to add additional links and other output
function new_nav_menu_items($items) {
    $homelink = '<li class="home"><a href="' . home_url( '/' ) . '">' . __('Home') . '</a></li>';
    // add the home link to the end of the menu
    $items = $items . $homelink;
    return $items;
}
add_filter( 'wp_nav_menu_items', 'new_nav_menu_items' );

あるいは、より具体的には、上のadd_filter行を次のように置き換え、$menu->slugをあなたのメニューの実際のスラッグ名に置き換えることで、目的のメニューだけをターゲットにすることができます。

add_filter( 'wp_nav_menu_{$menu->slug}_items', 'new_nav_menu_items' );

ソースチュートリアル

12
helgatheviking

containerfalseに設定してitems_wrap引数を使用してulを省略すると、関数はliタグのみを出力するので、必要に応じてそれをラップできます。

wp_nav_menu(
    array(
        'theme_location' => 'primary',
        'items_wrap' => '%3$s',
        'container' => false
    )
);
0
Milo