web-dev-qa-db-ja.com

「main」と呼ばれるwordpressメニューのトップレベルリンクにスパンを追加します

「メイン」と呼ばれる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。それはこれを達成するための最良のフィルター/方法ですか?

助けてくれてありがとう。

1
user3643520

$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_objectsbestフィルタであるかどうかは議論の余地がありますが、当面の問題を解決するのに適していると思います。メニューのHTMLを解析する必要があるwp_nav_menu_itemswp_nav_menu_{$menu->slug}_itemswp_nav_menuなどの後のフィルターのいずれかを使用するよりも確かに良いでしょう。

0
Dave Romsey