WP_NAV_MENUは、親/祖先クラスを生成しません
-
16-10-2019 - |
質問
メニュー項目の適切なクラスが生成されない理由はわかりません - サブツリーのみが得られるツリーのすべての要素は 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「動作していないリンク」を投稿して申し訳ありません - それは評判の制限が原因です
どんなアイデアでも - 感謝します。
解決
これはコードの一部です _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';
- IDは一致する必要があります。
- それはでなければなりません
post_type
タイプ。 - クエリは次のとおりです
is_singular
.
アイテムタイプのCSSクラスが正しく生成されるため、2番目のポイントを除外できます。したがって、IDまたは is_singular
条件付き。
ページでセカンダリループを実行していますか?条件が破る最も一般的な理由は、の不適切な使用です query_posts()
.
他のヒント
あなたのケースで機能しない理由はわかりません...あなたが言うように、アクティブページはクラスに「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);
もちろん、組み込みの機能があなたのために機能しない理由を理解したいと思いますが、それを複製するために何かをハッキングする前に、必要に応じてそのフィルターで多くのことをすることができます...