web-dev-qa-db-ja.com

wp_nav_menuは親/先祖クラスを生成しません

メニュー項目の適切なクラスが生成されない理由はわかりません - サブツリーを持つツリー内のすべての要素はmenu-item menu-item-type-post_typeのみを取得します。子を持たない要素は、クリックされた(アクティブになった)後に適切なクラスを取得します。

リンク: http://lichens.ie/

メニュー構造の一部: http://imgur.com/5Lj00.png

コード

$args = array(
    'menu'      => 'Main menu',
    'container' => '',
    'menu_id'   => 'nav',
);
wp_nav_menu($args);

あなたが訪れたとき http://lichens.ie/view-lichens-by/lichens-by-habitat/ これには「現在の」クラスがないことがわかります。それは親です。

PS「機能していないリンク」を投稿して申し訳ありません - 評判の制限によるものです

任意のアイデア - 大いに感謝するのに役立ちます。

2
chodorowicz

これは、現在のページのクラスを処理する_wp_menu_item_classes_by_context()のコードの一部です。

// if the menu item corresponds to the currently-queried post or taxonomy object
} elseif (
    $menu_item->object_id == $queried_object_id &&
    (
        ( ! empty( $home_page_id ) && 'post_type' == $menu_item->type && $wp_query->is_home && $home_page_id == $menu_item->object_id ) ||
        ( 'post_type' == $menu_item->type && $wp_query->is_singular ) ||
        ( 'taxonomy' == $menu_item->type && ( $wp_query->is_category || $wp_query->is_tag || $wp_query->is_tax ) )
    )
) {
    $classes[] = 'current-menu-item';
  1. IDは一致しなければなりません。
  2. post_typeタイプでなければなりません。
  3. クエリはis_singularに対するものでなければなりません。

項目タイプのCSSクラスが正しく生成されるため、2番目の点は除外できます。そのため、IDまたはis_singular条件付きのいずれかで問題が発生します。

二次ループをページ上で実行していますか?条件式が壊れる最も一般的な理由はquery_posts()の不適切な使用です。

5
Rarst

なぜあなたのケースではうまくいかないのかわかりません...あなたが言うように、アクティブなページは 'current_menu_item'がそのクラスに追加されるべきです。他の原因で問題が発生した場合は、常に 'nav_menu_css_class'フィルタを使用して独自のクラスを追加できます。このちょっとしたコードは、基本的に 'current_menu_item'と 'current_menu_parent'クラスを複製し、 'has_children'クラスを追加します(展開可能なメニューやドロップダウンメニューに便利です)

function check_for_submenu($classes, $item) {
    global $wpdb, $post;
    if ($item->ID == $post->ID) array_Push($classes,'current_menu_item');
    $has_children = $wpdb->get_var("SELECT COUNT(meta_id) FROM wp_postmeta WHERE meta_key='_menu_item_menu_item_parent' AND meta_value='".$item->ID."'");
    if ($has_children > 0) {
        array_Push($classes,'has_children');
        $child_pages = $wpdb->get_col("SELECT c.meta_value FROM wp_postmeta AS c, wp_postmeta AS th 
                                      WHERE c.meta_key = '_menu_item_object_id' AND c.post_id = th.metavalue 
                                      AND th.meta_key= '_menu_item_menu_item_parent' AND th.post_id = {$item->ID}");
        if (in_array($post->ID,$child_pages)) array_Push($classes,'current_menu_parent');
    }
    return $classes;
}

add_filter( 'nav_menu_css_class', 'check_for_submenu', 10, 2);

もちろん、それを複製するために何かをハックする前になぜ組み込みの機能がうまくいかなかったのかを把握したいのですが、必要に応じてそのフィルタで多くのことができます...

1
goldenapples