「メイン」と呼ばれるwordpressメニューのトップレベルリンクにスパンを追加したい。
目的のhtml出力(明確なビジュアルのために削除されたワードプレスクラス)は次のようになります。
<ul>
<li><a href="#"><span>Link</span></a></li>
<li><a href="#"><span>Link</span></a>
<ul>
<li><a href="#">Sub Link (no span)</a></li>
<li><a href="#">Sub Link (no span)</a></li>
<li><a href="#">Sub Link (no span)</a></li>
</ul>
</li>
<li><a href="#"><span>Link</span></a></li>
<li><a href="#"><span>Link</span></a></li>
</ul>
このwordpressフィルターは、ググリング(ほとんどの場合、スタックオーバーフローで、どこにあるか覚えていない)がスパンを適切に追加するときに見つけましたが、テーマのすべてのメニューに追加します。
add_filter( 'wp_nav_menu_objects', function( $items ) {
foreach ( $items as $item ) {
if (!$item->menu_item_parent) {
$item->title = '<span>' . $item->title . '</span>';
}
}
return $items;
});
Q1。 mainというメニューにだけこのフィルターを追加する方法はありますか?
Q2。それはこれを達成するための最良のフィルター/方法ですか?
助けてくれてありがとう。
$args
に渡される2番目のパラメータwp_nav_menu_objects
は、どのメニューが処理されているのかを確認するために使用できます。これにより、目的のメニューのみをターゲットにすることができます。
以下のコードでは、メニューのスラッグがmain
であるかどうかをチェックし、もしそうであれば、トップレベルのメニュー項目をspanタグで囲みます。
/**
* Filters the sorted list of menu item objects before generating the menu's HTML.
*
* @param array $sorted_menu_items The menu items, sorted by each menu item's menu order.
* @param stdClass $args An object containing wp_nav_menu() arguments.
*/
add_filter( 'wp_nav_menu_objects', 'wpse_wp_nav_menu_objects', 10, 2 );
function wpse_wp_nav_menu_objects( $sorted_menu_items, $args ) {
// Only modify the "main" menu.
if ( ! isset( $args->menu->slug ) || 'main' !== $args->menu->slug ) {
return $sorted_menu_items;
}
// Loop over the menu items wrapping only top level items in span tags.
foreach ( $sorted_menu_items as $item ) {
if ( ! $item->menu_item_parent ) {
$item->title = '<span>' . $item->title . '</span>';
}
}
return $sorted_menu_items;
}
上記のフィルタは技術的にはすべてのメニューに対して実行されますが、チェックインを行うと、目的のメニューにのみ影響します。
wp_nav_menu_objects
がbestフィルタであるかどうかは議論の余地がありますが、当面の問題を解決するのに適していると思います。メニューのHTMLを解析する必要があるwp_nav_menu_items
、wp_nav_menu_{$menu->slug}_items
、wp_nav_menu
などの後のフィルターのいずれかを使用するよりも確かに良いでしょう。