私のプロジェクトには以下の機能があります。
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; ?>
これは現在、私のメニューにあるすべてのナビゲーションアイテム - 親/トップレベルとサブナビゲーション - を返します。これを変更してすべてのサブナビゲーション項目を除外するように変更する方法を考えています。親/最上位のアイテムのみを表示したいです。
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));
}
これは私のために働いた:
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>';
}
?>