web-dev-qa-db-ja.com

Wp_get_nav_menu_itemsを使用してメニューから最上位のナビゲーション項目のみを返す

私のプロジェクトには以下の機能があります。

function cr_get_menu_items($menu_location)
{
    $locations = get_nav_menu_locations();
    $menu = get_term($locations[$menu_location], 'nav_menu');
    return wp_get_nav_menu_items($menu->term_id);
}

この関数は私のテーマでは次のように使われています。

  <?php $nav = cr_get_menu_items('navigation_menu') ?>
  <?php foreach ($nav as $link): ?>
    <a href="<?= $link->url ?>"><?= $link->title ?></a>
  <?php endforeach; ?>

これは現在、私のメニューにあるすべてのナビゲーションアイテム - 親/トップレベルとサブナビゲーション - を返します。これを変更してすべてのサブナビゲーション項目を除外するように変更する方法を考えています。親/最上位のアイテムのみを表示したいです。

1
Liz

wp_get_nav_menu_itemsコードリファレンス を見てみましょう。

それは2つのパラメータを取ります。

  • $menu - (int | string | WP_Term)(必須)メニューID、スラッグ、名前、またはオブジェクト
  • $args - (配列)(オプション)get_posts()に渡す引数。

だからここでget_posts argsを使うことができます…そしてトップレベルの投稿だけを取得したいのなら、post_parent argは役に立ちます...

それで、このような何かがトリックをするべきです:

function cr_get_menu_items($menu_location)
{
    $locations = get_nav_menu_locations();
    $menu = get_term($locations[$menu_location], 'nav_menu');
    return wp_get_nav_menu_items($menu->term_id, array('post_parent' => 0));
}
1

これは私のために働いた:

function cr_get_menu_items($Your_menu_location)
{
  $menuLocations = get_nav_menu_locations();
  $YourmenuID = $menuLocations[$Your_menu_location];
  $YourNavItems = wp_get_nav_menu_items($YourmenuID);
} 

$Your_menu_locationは、'navigation_menu'にメニューを登録した方法に応じて、'primary'またはfunctions.phpなどのメニュー名を表す文字列変数です。この関数は、私のテーマでは次のように使用されます。

<?php
  $menuitems = cr_get_menu_items('navigation_menu') ;
  foreach ( (array)$menuitems as $menuitem ) 
  {
    if (!$menuitem->menu_item_parent )
    echo '<a class="nav-link" href="'.$navItem->url.'">'.$navItem->title.' </a>';
  }
?>
0
Aness